From f32a0fe7ad2f595c84dd4ba87bf48668a45a8a98 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 13 Aug 2020 12:16:15 +0300 Subject: [PATCH] [FIR-TEST] Unify AbstractFirLoadCompiledKotlin and BuiltInsDeserializationForFirTestCase --- .../testData/builtIns/kotlin-collections.txt | 7 +++ .../testData/builtIns/kotlin.txt | 9 +-- .../kotlin/fir/AbstractFirLoadBinariesTest.kt | 53 ++++++++++++++++++ .../fir/AbstractFirLoadCompiledKotlin.kt | 55 +++---------------- .../BuiltInsDeserializationForFirTestCase.kt | 48 ++-------------- .../builtins/BuiltinsTestUtils.kt | 39 +++++++++++++ .../builtins/LoadBuiltinsTest.java | 28 ++-------- 7 files changed, 121 insertions(+), 118 deletions(-) create mode 100644 compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt create mode 100644 compiler/tests-common/tests/org/jetbrains/kotlin/serialization/builtins/BuiltinsTestUtils.kt diff --git a/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt b/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt index c02b5d6372a..284890057ef 100644 --- a/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt +++ b/compiler/fir/analysis-tests/testData/builtIns/kotlin-collections.txt @@ -1,3 +1,10 @@ +public/*package*/ open class ArraysUtilJVM : R|kotlin/Any| { + public/*package*/ open static fun !|> asList(p0: ): + + public/*package*/ constructor(): R|kotlin/collections/ArraysUtilJVM| + +} + public abstract class BooleanIterator : R|kotlin/collections/Iterator| { public final operator fun next(): R|kotlin/Boolean| diff --git a/compiler/fir/analysis-tests/testData/builtIns/kotlin.txt b/compiler/fir/analysis-tests/testData/builtIns/kotlin.txt index b7ed8e4ae25..d4677da90ee 100644 --- a/compiler/fir/analysis-tests/testData/builtIns/kotlin.txt +++ b/compiler/fir/analysis-tests/testData/builtIns/kotlin.txt @@ -22,10 +22,10 @@ public final fun intArrayOf(vararg elements: R|kotlin/IntArray|): R|kotlin/IntAr public final fun longArrayOf(vararg elements: R|kotlin/LongArray|): R|kotlin/LongArray| -public final fun shortArrayOf(vararg elements: R|kotlin/ShortArray|): R|kotlin/ShortArray| - public final operator fun R|kotlin/String?|.plus(other: R|kotlin/Any?|): R|kotlin/String| +public final fun shortArrayOf(vararg elements: R|kotlin/ShortArray|): R|kotlin/ShortArray| + public final fun R|kotlin/Any?|.toString(): R|kotlin/String| public abstract interface Annotation : R|kotlin/Any| { @@ -334,11 +334,6 @@ public abstract interface CharSequence : R|kotlin/Any| { } -public abstract interface Cloneable : R|kotlin/Any| { - protected open fun clone(): R|kotlin/Any| - -} - public abstract interface Comparable : R|kotlin/Any| { public abstract operator fun compareTo(other: R|T|): R|kotlin/Int| diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt new file mode 100644 index 00000000000..ceb5259fd88 --- /dev/null +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadBinariesTest.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir + +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.fir.resolve.firSymbolProvider +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.test.KotlinTestUtils +import java.io.File + +abstract class AbstractFirLoadBinariesTest : AbstractFirResolveWithSessionTestCase() { + /** + * Since fir symbol providers can't get all names in package (only fir provider can do it), + * we should collect that names from module descriptor from FE 1.0 + */ + protected fun checkPackageContent( + session: FirSession, + packageFqName: FqName, + moduleDescriptor: ModuleDescriptor, + testDataPath: String + ) { + val declarationNames = DescriptorUtils.getAllDescriptors(moduleDescriptor.getPackage(packageFqName).memberScope) + .mapTo(sortedSetOf()) { it.name } + + val provider = session.firSymbolProvider + + val builder = StringBuilder() + val firRenderer = FirRenderer(builder) + + for (name in declarationNames) { + for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) { + symbol.fir.accept(firRenderer) + builder.appendLine() + } + } + + for (name in declarationNames) { + val classLikeSymbol = provider.getClassLikeSymbolByFqName(ClassId.topLevel(packageFqName.child(name))) ?: continue + classLikeSymbol.fir.accept(firRenderer) + builder.appendLine() + } + + KotlinTestUtils.assertEqualsToFile( + File(testDataPath), + builder.toString() + ) + } +} diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadCompiledKotlin.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadCompiledKotlin.kt index 5a66af5ec5c..ee08b41651e 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadCompiledKotlin.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirLoadCompiledKotlin.kt @@ -9,19 +9,15 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.compileKotlinToDirAndGetModule -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils.newConfiguration import org.jetbrains.kotlin.test.TestJdkKind import java.io.File -abstract class AbstractFirLoadCompiledKotlin : AbstractFirResolveWithSessionTestCase() { +abstract class AbstractFirLoadCompiledKotlin : AbstractFirLoadBinariesTest() { protected lateinit var tmpdir: File override fun setUp() { @@ -37,8 +33,6 @@ abstract class AbstractFirLoadCompiledKotlin : AbstractFirResolveWithSessionTest val moduleDescriptor = compileKtFileToTmpDir(path) val packageFqName = FqName("test") - val allCompiledNames = DescriptorUtils.getAllDescriptors(moduleDescriptor.getPackage(packageFqName).memberScope) - .mapTo(sortedSetOf()) { it.name } val configuration = newConfiguration(ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK, listOf(tmpdir), emptyList()) val environment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) @@ -46,7 +40,14 @@ abstract class AbstractFirLoadCompiledKotlin : AbstractFirResolveWithSessionTest prepareProjectExtensions(environment.project) val sessionWithDependency = createSession(environment, GlobalSearchScope.EMPTY_SCOPE) - checkPackageContent(sessionWithDependency, packageFqName, allCompiledNames, path) + val testDataDirectoryPath = + "compiler/fir/analysis-tests/testData/loadCompiledKotlin/" + + path + .removePrefix("compiler/testData/loadJava/compiledKotlin/") + .removeSuffix(File(path).name) + File(testDataDirectoryPath).mkdirs() + + checkPackageContent(sessionWithDependency, packageFqName, moduleDescriptor, "$testDataDirectoryPath${getTestName(false)}.txt") } private fun compileKtFileToTmpDir(path: String): ModuleDescriptor { @@ -57,42 +58,4 @@ abstract class AbstractFirLoadCompiledKotlin : AbstractFirResolveWithSessionTest return compileKotlinToDirAndGetModule(listOf(file), tmpdir, environment) } - - private fun checkPackageContent( - session: FirSession, - packageFqName: FqName, - declarationNames: Set, - testDataPath: String - ) { - val provider = session.firSymbolProvider - - val builder = StringBuilder() - val firRenderer = FirRenderer(builder) - - for (name in declarationNames) { - for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) { - symbol.fir.accept(firRenderer) - builder.appendLine() - } - } - - for (name in declarationNames) { - val classLikeSymbol = provider.getClassLikeSymbolByFqName(ClassId.topLevel(packageFqName.child(name))) ?: continue - classLikeSymbol.fir.accept(firRenderer) - builder.appendLine() - } - - val testDataDirectoryPath = - "compiler/fir/analysis-tests/testData/loadCompiledKotlin/" + - testDataPath - .removePrefix("compiler/testData/loadJava/compiledKotlin/") - .removeSuffix(File(testDataPath).name) - File(testDataDirectoryPath).mkdirs() - - KotlinTestUtils.assertEqualsToFile( - File(testDataDirectoryPath + getTestName(false) + ".txt"), - builder.toString() - ) - } - } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/BuiltInsDeserializationForFirTestCase.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/BuiltInsDeserializationForFirTestCase.kt index dcc30965d7d..b4d6fb25f45 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/BuiltInsDeserializationForFirTestCase.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/BuiltInsDeserializationForFirTestCase.kt @@ -6,58 +6,22 @@ package org.jetbrains.kotlin.fir import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.builtins.BuiltinsTestUtils import org.jetbrains.kotlin.test.ConfigurationKind -import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestJdkKind -import java.io.File -class BuiltInsDeserializationForFirTestCase : AbstractFirResolveWithSessionTestCase() { +class BuiltInsDeserializationForFirTestCase : AbstractFirLoadBinariesTest() { override fun createEnvironment(): KotlinCoreEnvironment { return createEnvironmentWithJdk(ConfigurationKind.ALL, TestJdkKind.FULL_JDK) } fun testBuiltInPackagesContent() { - for (packageFqName in listOf( - KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, - KotlinBuiltIns.COLLECTIONS_PACKAGE_FQ_NAME, - KotlinBuiltIns.RANGES_PACKAGE_FQ_NAME - )) { - checkPackageContent(packageFqName) - } - } - - private fun checkPackageContent(packageFqName: FqName) { + val moduleDescriptor = BuiltinsTestUtils.compileBuiltinsModule(environment) val session = createSession(environment, GlobalSearchScope.allScope(project)) - val provider = session.firSymbolProvider - - val builder = StringBuilder() - val firRenderer = FirRenderer(builder) - - for (name in provider.getAllCallableNamesInPackage(packageFqName)) { - for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) { - symbol.fir.accept(firRenderer) - builder.appendLine() - } + for (packageFqName in BuiltinsTestUtils.BUILTIN_PACKAGE_NAMES) { + val path = "compiler/fir/analysis-tests/testData/builtIns/" + packageFqName.asString().replace('.', '-') + ".txt" + checkPackageContent(session, packageFqName, moduleDescriptor, path) } - - for (name in provider.getClassNamesInPackage(packageFqName)) { - val classLikeSymbol = - provider.getClassLikeSymbolByFqName(ClassId.topLevel(packageFqName.child(name))) as FirClassSymbol? - ?: continue - classLikeSymbol.fir.accept(firRenderer) - builder.appendLine() - } - - - KotlinTestUtils.assertEqualsToFile( - File("compiler/fir/analysis-tests/testData/builtIns/" + packageFqName.asString().replace('.', '-') + ".txt"), - builder.toString() - ) } } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/serialization/builtins/BuiltinsTestUtils.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/serialization/builtins/BuiltinsTestUtils.kt new file mode 100644 index 00000000000..63307bdd449 --- /dev/null +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/serialization/builtins/BuiltinsTestUtils.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.serialization.builtins + +import com.intellij.openapi.util.io.FileUtil +import com.intellij.util.containers.ContainerUtil +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.resolve.lazy.createResolveSessionForFiles +import org.jetbrains.kotlin.test.KotlinTestUtils +import java.io.File +import java.util.regex.Pattern + +object BuiltinsTestUtils { + fun compileBuiltinsModule(environment: KotlinCoreEnvironment): ModuleDescriptor { + val files = KotlinTestUtils.loadToJetFiles( + environment, ContainerUtil.concat( + allFilesUnder("core/builtins/native"), + allFilesUnder("core/builtins/src") + ) + ) + return createResolveSessionForFiles(environment.project, files, false).moduleDescriptor + } + + @JvmField + val BUILTIN_PACKAGE_NAMES = listOf( + KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, + KotlinBuiltIns.COLLECTIONS_PACKAGE_FQ_NAME, + KotlinBuiltIns.RANGES_PACKAGE_FQ_NAME + ) + + private fun allFilesUnder(directory: String): List { + return FileUtil.findFilesByMask(Pattern.compile(".*\\.kt"), File(directory)) + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java index 6cf6c8943c5..d7493dffcd8 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.serialization.builtins; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.containers.ContainerUtil; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.DefaultBuiltIns; @@ -32,23 +30,18 @@ import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProv import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.resolve.lazy.LazyResolveTestUtilsKt; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor; import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInsLoaderImpl; import org.jetbrains.kotlin.storage.LockBasedStorageManager; 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.util.RecursiveDescriptorComparator; import java.io.File; import java.util.Collections; -import java.util.List; -import java.util.regex.Pattern; -import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.*; +import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAMES; public class LoadBuiltinsTest extends KotlinTestWithEnvironment { @Override @@ -56,18 +49,12 @@ public class LoadBuiltinsTest extends KotlinTestWithEnvironment { return createEnvironmentWithJdk(ConfigurationKind.JDK_NO_RUNTIME, TestJdkKind.MOCK_JDK); } - public void testBuiltIns() throws Exception { + public void testBuiltIns() { + ModuleDescriptor module = BuiltinsTestUtils.INSTANCE.compileBuiltinsModule(getEnvironment()); + PackageFragmentProvider packageFragmentProvider = createBuiltInsPackageFragmentProvider(); - List files = KotlinTestUtils.loadToJetFiles(getEnvironment(), ContainerUtil.concat( - allFilesUnder("core/builtins/native"), - allFilesUnder("core/builtins/src") - )); - - ModuleDescriptor module = - LazyResolveTestUtilsKt.createResolveSessionForFiles(getEnvironment().getProject(), files, false).getModuleDescriptor(); - - for (FqName packageFqName : CollectionsKt.listOf(BUILT_INS_PACKAGE_FQ_NAME, COLLECTIONS_PACKAGE_FQ_NAME, RANGES_PACKAGE_FQ_NAME)) { + for (FqName packageFqName : BuiltinsTestUtils.BUILTIN_PACKAGE_NAMES) { PackageFragmentDescriptor fromLazyResolve = CollectionsKt.single(module.getPackage(packageFqName).getFragments()); if (fromLazyResolve instanceof LazyPackageDescriptor) { @@ -101,9 +88,4 @@ public class LoadBuiltinsTest extends KotlinTestWithEnvironment { return packageFragmentProvider; } - - @NotNull - private static List allFilesUnder(@NotNull String directory) { - return FileUtil.findFilesByMask(Pattern.compile(".*\\.kt"), new File(directory)); - } }