FIR IDE: add API to get super types of a KtType

This commit is contained in:
Tianyu Geng
2021-10-06 15:49:27 -07:00
committed by Ilya Kirillov
parent 09d16ce849
commit 8b44a4685f
34 changed files with 568 additions and 1 deletions
@@ -20,12 +20,24 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker
import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker.isCompatible
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClass
import org.jetbrains.kotlin.fir.analysis.checkers.typeParameterSymbols
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -34,6 +46,8 @@ import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
import org.jetbrains.kotlin.types.model.CaptureStatus
internal class KtFirTypeProvider(
override val analysisSession: KtFirAnalysisSession,
@@ -110,5 +124,68 @@ internal class KtFirTypeProvider(
return analysisSession.firResolveState.getTowerContextProvider()
.getClosestAvailableParentContext(position)?.implicitReceiverStack?.map { it.type.asKtType() } ?: emptyList()
}
override fun getDirectSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
require(type is KtFirType)
return type.coneType.getDirectSuperTypes(shouldApproximate).mapTo(mutableListOf()) { it.asKtType() }
}
private fun ConeKotlinType.getDirectSuperTypes(shouldApproximate: Boolean): Sequence<ConeKotlinType> {
return when (this) {
// We also need to collect those on `upperBound` due to nullability.
is ConeFlexibleType -> lowerBound.getDirectSuperTypes(shouldApproximate) + upperBound.getDirectSuperTypes(shouldApproximate)
is ConeDefinitelyNotNullType -> original.getDirectSuperTypes(shouldApproximate).map { ConeDefinitelyNotNullType(it) }
is ConeIntersectionType -> intersectedTypes.asSequence().flatMap { it.getDirectSuperTypes(shouldApproximate) }
is ConeClassErrorType -> emptySequence()
is ConeLookupTagBasedType -> getSubstitutedSuperTypes(shouldApproximate)
else -> emptySequence()
}.distinct()
}
private fun ConeLookupTagBasedType.getSubstitutedSuperTypes(shouldApproximate: Boolean): Sequence<ConeKotlinType> {
val session = analysisSession.firResolveState.rootModuleSession
val symbol = lookupTag.toSymbol(session)
val superTypes = when (symbol) {
is FirAnonymousObjectSymbol -> symbol.superConeTypes
is FirRegularClassSymbol -> symbol.superConeTypes
is FirTypeAliasSymbol -> symbol.fullyExpandedClass(session)?.superConeTypes ?: return emptySequence()
is FirTypeParameterSymbol -> symbol.resolvedBounds.map { it.type }
else -> return emptySequence()
}
val typeParameterSymbols = symbol.typeParameterSymbols ?: return superTypes.asSequence()
val argumentTypes = (session.typeContext.captureArguments(this, CaptureStatus.FROM_EXPRESSION)?.toList()
?: this.typeArguments.mapNotNull { it.type })
require(typeParameterSymbols.size == argumentTypes.size) {
"'${symbol.fir.render(FirRenderer.RenderMode.NoBodies)}' expects '${typeParameterSymbols.size}' type arguments " +
"but type '${this.render()}' has ${argumentTypes.size} type arguments."
}
val substitutor = substitutorByMap(typeParameterSymbols.zip(argumentTypes).toMap(), session)
return superTypes.asSequence().map {
val type = substitutor.substituteOrSelf(it)
if (shouldApproximate) {
session.inferenceComponents.approximator.approximateToSuperType(
type,
TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference
) ?: type
} else {
type
}.withNullability(nullability, session.typeContext)
}
}
override fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
require(type is KtFirType)
val queue = type.coneType.getDirectSuperTypes(shouldApproximate).toCollection(ArrayDeque())
return buildSet {
while (queue.isNotEmpty()) {
val current = queue.removeFirst()
if (!add(current)) continue
queue.addAll(current.getDirectSuperTypes(shouldApproximate))
}
}.map { it.asKtType() }
}
}
@@ -0,0 +1,47 @@
/*
* Copyright 2010-2021 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.analysis.api.fir.components
import org.jetbrains.kotlin.analysis.api.analyse
import org.jetbrains.kotlin.analysis.api.fir.executeOnPooledThreadInReadAction
import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
abstract class AbstractGetSuperTypesTest : AbstractHLApiSingleFileTest() {
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
val expression = testServices.expressionMarkerProvider.getSelectedElement(ktFile)
val actual = executeOnPooledThreadInReadAction {
analyse(expression) {
val expectedType = expression.getExpectedType() ?: error("expect to get type of expression '${expression.text}'")
val directSuperTypes = expectedType.getDirectSuperTypes()
val approximatedDirectSuperTypes = expectedType.getDirectSuperTypes(shouldApproximate = true)
val allSuperTypes = expectedType.getAllSuperTypes()
val approximatedAllSuperTypes = expectedType.getAllSuperTypes(shouldApproximate = true)
buildString {
fun List<KtType>.print(name: String) {
appendLine(name)
for (type in this) {
appendLine(type.render())
}
appendLine()
}
directSuperTypes.print("[direct super types]")
approximatedDirectSuperTypes.print("[approximated direct super types]")
allSuperTypes.print("[all super types]")
approximatedAllSuperTypes.print("[approximated all super types]")
}
}
}
testServices.assertions.assertEqualsToFile(testDataFileSibling(".txt"), actual)
}
}
@@ -0,0 +1,110 @@
/*
* Copyright 2010-2021 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.analysis.api.fir.components;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/components/getSuperTypes")
@TestDataPath("$PROJECT_ROOT")
public class GetSuperTypesTestGenerated extends AbstractGetSuperTypesTest {
@Test
public void testAllFilesPresentInGetSuperTypes() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/getSuperTypes"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("anonymousObject.kt")
public void testAnonymousObject() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/anonymousObject.kt");
}
@Test
@TestMetadata("any.kt")
public void testAny() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/any.kt");
}
@Test
@TestMetadata("contravariant.kt")
public void testContravariant() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/contravariant.kt");
}
@Test
@TestMetadata("covariant.kt")
public void testCovariant() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/covariant.kt");
}
@Test
@TestMetadata("errorType.kt")
public void testErrorType() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/errorType.kt");
}
@Test
@TestMetadata("flexibleType.kt")
public void testFlexibleType() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/flexibleType.kt");
}
@Test
@TestMetadata("int.kt")
public void testInt() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/int.kt");
}
@Test
@TestMetadata("invariant.kt")
public void testInvariant() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/invariant.kt");
}
@Test
@TestMetadata("recursiveTypeParameter.kt")
public void testRecursiveTypeParameter() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/recursiveTypeParameter.kt");
}
@Test
@TestMetadata("regularClass.kt")
public void testRegularClass() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/regularClass.kt");
}
@Test
@TestMetadata("regularClassWithBounds.kt")
public void testRegularClassWithBounds() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/regularClassWithBounds.kt");
}
@Test
@TestMetadata("star.kt")
public void testStar() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/star.kt");
}
@Test
@TestMetadata("string.kt")
public void testString() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/string.kt");
}
@Test
@TestMetadata("typeParameter.kt")
public void testTypeParameter() throws Exception {
runTest("analysis/analysis-api/testData/components/getSuperTypes/typeParameter.kt");
}
}
@@ -32,6 +32,11 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
public abstract fun haveCommonSubtype(a: KtType, b: KtType): Boolean
public abstract fun getImplicitReceiverTypesAtPosition(position: KtElement): List<KtType>
public abstract fun getDirectSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType>
public abstract fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType>
}
public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
@@ -91,6 +96,28 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
*/
public fun getImplicitReceiverTypesAtPosition(position: KtElement): List<KtType> =
analysisSession.typeProvider.getImplicitReceiverTypesAtPosition(position)
/**
* Gets the direct super types of the given type. For example, given `MutableList<String>`, this returns `List<String>` and
* `MutableCollection<String>`.
*
* Note that for flexible types, both direct super types of the upper and lower bounds are returned. If that's not desirable, please
* first call [KtFlexibleType.upperBound] or [KtFlexibleType.lowerBound] and then call this method.
*
* @param shouldApproximate whether to approximate non-denotable types. For example, super type of `List<out String>` is
* `Collection<CAPTURED out String>`. With approximation set to true, `Collection<out String>` is returned instead.
*/
public fun KtType.getDirectSuperTypes(shouldApproximate: Boolean = false): List<KtType> =
analysisSession.typeProvider.getDirectSuperTypes(this, shouldApproximate)
/**
* Gets all the super types of the given type. The returned result is ordered by a BFS traversal of the class hierarchy, without any
* duplicates.
*
* @param shouldApproximate see [getDirectSuperTypes]
*/
public fun KtType.getAllSuperTypes(shouldApproximate: Boolean = false): List<KtType> =
analysisSession.typeProvider.getAllSuperTypes(this, shouldApproximate)
}
@Suppress("PropertyName")
@@ -0,0 +1,4 @@
interface A
interface B
val o = object: A, B {}
val o2 = <expr>o</expr>
@@ -0,0 +1,17 @@
[direct super types]
A
B
[approximated direct super types]
A
B
[all super types]
A
B
kotlin.Any
[approximated all super types]
A
B
kotlin.Any
@@ -0,0 +1 @@
val a = <expr>Any()</expr>
@@ -0,0 +1,7 @@
[direct super types]
[approximated direct super types]
[all super types]
[approximated all super types]
@@ -0,0 +1,3 @@
val s = <expr>get()</expr>
fun get() : MutableList<in String>
@@ -0,0 +1,23 @@
[direct super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
[approximated direct super types]
kotlin.collections.List<kotlin.Any?>
kotlin.collections.MutableCollection<in kotlin.String>
[all super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Collection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableIterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Iterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.Any?>
kotlin.collections.MutableCollection<in kotlin.String>
kotlin.collections.Collection<kotlin.Any?>
kotlin.collections.MutableIterable<kotlin.Any?>
kotlin.collections.Iterable<kotlin.Any?>
kotlin.Any
@@ -0,0 +1,3 @@
val s = <expr>get()</expr>
fun get() : MutableList<out String>
@@ -0,0 +1,23 @@
[direct super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
[approximated direct super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<out kotlin.String>
[all super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Collection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableIterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Iterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<out kotlin.String>
kotlin.collections.Collection<kotlin.String>
kotlin.collections.MutableIterable<kotlin.String>
kotlin.collections.Iterable<kotlin.String>
kotlin.Any
@@ -0,0 +1,2 @@
val i: UnresolvedType? = null
val j = <expr>i</expr>
@@ -0,0 +1,7 @@
[direct super types]
[approximated direct super types]
[all super types]
[approximated all super types]
@@ -0,0 +1,12 @@
// FILE: Java.java
import java.util.List
class Java {
public static List<String> getNames() {
throw Exception()
}
}
// FILE: test.kt
val i = <expr>Java.getNames()</expr>
@@ -0,0 +1,32 @@
[direct super types]
kotlin.collections.List<kotlin.String!>
kotlin.collections.MutableCollection<kotlin.String!>
kotlin.collections.Collection<kotlin.String!>?
[approximated direct super types]
kotlin.collections.List<kotlin.String!>
kotlin.collections.MutableCollection<kotlin.String!>
kotlin.collections.Collection<kotlin.String!>?
[all super types]
kotlin.collections.List<kotlin.String!>
kotlin.collections.MutableCollection<kotlin.String!>
kotlin.collections.Collection<kotlin.String!>?
kotlin.collections.Collection<kotlin.String!>
kotlin.collections.MutableIterable<kotlin.String!>
kotlin.collections.Iterable<kotlin.String!>?
kotlin.collections.Iterable<kotlin.String!>
kotlin.Any?
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.String!>
kotlin.collections.MutableCollection<kotlin.String!>
kotlin.collections.Collection<kotlin.String!>?
kotlin.collections.Collection<kotlin.String!>
kotlin.collections.MutableIterable<kotlin.String!>
kotlin.collections.Iterable<kotlin.String!>?
kotlin.collections.Iterable<kotlin.String!>
kotlin.Any?
kotlin.Any
@@ -0,0 +1 @@
val i = <expr>1</expr>
@@ -0,0 +1,21 @@
[direct super types]
kotlin.Number
kotlin.Comparable<kotlin.Int>
java.io.Serializable
[approximated direct super types]
kotlin.Number
kotlin.Comparable<kotlin.Int>
java.io.Serializable
[all super types]
kotlin.Number
kotlin.Comparable<kotlin.Int>
java.io.Serializable
kotlin.Any
[approximated all super types]
kotlin.Number
kotlin.Comparable<kotlin.Int>
java.io.Serializable
kotlin.Any
@@ -0,0 +1,3 @@
val s = <expr>get()</expr>
fun get() : MutableList<String>
@@ -0,0 +1,23 @@
[direct super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<kotlin.String>
[approximated direct super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<kotlin.String>
[all super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<kotlin.String>
kotlin.collections.Collection<kotlin.String>
kotlin.collections.MutableIterable<kotlin.String>
kotlin.collections.Iterable<kotlin.String>
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.MutableCollection<kotlin.String>
kotlin.collections.Collection<kotlin.String>
kotlin.collections.MutableIterable<kotlin.String>
kotlin.collections.Iterable<kotlin.String>
kotlin.Any
@@ -0,0 +1,3 @@
class Foo<T : Foo<T>>(t: T) {
val t2 = <expr>t</expr>
}
@@ -0,0 +1,13 @@
[direct super types]
Foo<T>
[approximated direct super types]
Foo<T>
[all super types]
Foo<T>
kotlin.Any
[approximated all super types]
Foo<T>
kotlin.Any
@@ -0,0 +1,3 @@
class A
val a = <expr>A()</expr>
@@ -0,0 +1,11 @@
[direct super types]
kotlin.Any
[approximated direct super types]
kotlin.Any
[all super types]
kotlin.Any
[approximated all super types]
kotlin.Any
@@ -0,0 +1,5 @@
interface I
open class A
class B: A(), I
val b = <expr>B()</expr>
@@ -0,0 +1,17 @@
[direct super types]
A
I
[approximated direct super types]
A
I
[all super types]
A
I
kotlin.Any
[approximated all super types]
A
I
kotlin.Any
@@ -0,0 +1,3 @@
val s = <expr>get()</expr>
fun get() : MutableList<*>
@@ -0,0 +1,23 @@
[direct super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
[approximated direct super types]
kotlin.collections.List<kotlin.Any?>
kotlin.collections.MutableCollection<out kotlin.Any?>
[all super types]
kotlin.collections.List<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableCollection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Collection<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.MutableIterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.collections.Iterable<ERROR_TYPE <Unexpected cone type org.jetbrains.kotlin.fir.types.ConeCapturedType>>
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.Any?>
kotlin.collections.MutableCollection<out kotlin.Any?>
kotlin.collections.Collection<kotlin.Any?>
kotlin.collections.MutableIterable<kotlin.Any?>
kotlin.collections.Iterable<kotlin.Any?>
kotlin.Any
@@ -0,0 +1 @@
val s = <expr>""</expr>
@@ -0,0 +1,21 @@
[direct super types]
kotlin.Comparable<kotlin.String>
kotlin.CharSequence
java.io.Serializable
[approximated direct super types]
kotlin.Comparable<kotlin.String>
kotlin.CharSequence
java.io.Serializable
[all super types]
kotlin.Comparable<kotlin.String>
kotlin.CharSequence
java.io.Serializable
kotlin.Any
[approximated all super types]
kotlin.Comparable<kotlin.String>
kotlin.CharSequence
java.io.Serializable
kotlin.Any
@@ -0,0 +1,3 @@
class Foo<T : List<String>>(t: T) {
val t2 = <expr>t</expr>
}
@@ -0,0 +1,17 @@
[direct super types]
kotlin.collections.List<kotlin.String>
[approximated direct super types]
kotlin.collections.List<kotlin.String>
[all super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.Collection<kotlin.String>
kotlin.collections.Iterable<kotlin.String>
kotlin.Any
[approximated all super types]
kotlin.collections.List<kotlin.String>
kotlin.collections.Collection<kotlin.String>
kotlin.collections.Iterable<kotlin.String>
kotlin.Any
@@ -392,7 +392,7 @@ fun ConeTypeContext.captureFromArgumentsInternal(type: ConeKotlinType, status: C
}
}
private fun ConeTypeContext.captureArguments(type: ConeKotlinType, status: CaptureStatus): Array<ConeKotlinType>? {
fun ConeTypeContext.captureArguments(type: ConeKotlinType, status: CaptureStatus): Array<ConeKotlinType>? {
val argumentsCount = type.typeArguments.size
if (argumentsCount == 0) return null
@@ -88,6 +88,10 @@ fun main(args: Array<String>) {
testClass<AbstractHasCommonSubtypeTest> {
model("components/hasCommonSubtype")
}
testClass<AbstractGetSuperTypesTest> {
model("components/getSuperTypes")
}
}
testGroup("analysis/low-level-api-fir/tests", "compiler/fir/raw-fir/psi2fir/testData") {