[FIR-TEST] Unify AbstractFirLoadCompiledKotlin and BuiltInsDeserializationForFirTestCase

This commit is contained in:
Dmitriy Novozhilov
2020-08-13 12:16:15 +03:00
parent 913ea9b56d
commit f32a0fe7ad
7 changed files with 121 additions and 118 deletions
@@ -1,3 +1,10 @@
public/*package*/ open class ArraysUtilJVM : R|kotlin/Any| {
public/*package*/ open static fun <T : R|ft<kotlin/Any, kotlin/Any?>!|> asList(p0: ):
public/*package*/ constructor(): R|kotlin/collections/ArraysUtilJVM|
}
public abstract class BooleanIterator : R|kotlin/collections/Iterator<kotlin/Boolean>| {
public final operator fun next(): R|kotlin/Boolean|
+2 -7
View File
@@ -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<in T> : R|kotlin/Any| {
public abstract operator fun compareTo(other: R|T|): R|kotlin/Int|
@@ -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()
)
}
}
@@ -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<File>())
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<Name>,
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()
)
}
}
@@ -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()
)
}
}
@@ -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<File>(
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<File?> {
return FileUtil.findFilesByMask(Pattern.compile(".*\\.kt"), File(directory))
}
}
@@ -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<KtFile> 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<File> allFilesUnder(@NotNull String directory) {
return FileUtil.findFilesByMask(Pattern.compile(".*\\.kt"), new File(directory));
}
}