From 684bdc44bb34985fef990ef8c7a65c733ec85520 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 16 Dec 2019 17:34:12 +0300 Subject: [PATCH] FIR: add implementation of reified type parameter references This adds support of T::class.java for reified type parameters --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 18 ++++++-- .../jetbrains/kotlin/fir/FirCallResolver.kt | 35 +++++++++------ .../kotlin/fir/resolve/ResolveUtils.kt | 11 +++-- .../FirExpressionsResolveTransformer.kt | 14 ++++-- .../problems/classLiteralForParameter.kt | 2 +- .../problems/classLiteralForParameter.txt | 2 +- .../FirResolvedReifiedParameterReference.kt | 26 +++++++++++ ...irResolvedReifiedParameterReferenceImpl.kt | 43 +++++++++++++++++++ .../kotlin/fir/visitors/FirTransformer.kt | 9 ++++ .../kotlin/fir/visitors/FirVisitor.kt | 3 ++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 ++++ .../fir/tree/generator/FirTreeBuilder.kt | 1 + .../generator/ImplementationConfigurator.kt | 2 + .../fir/tree/generator/NodeConfigurator.kt | 4 ++ .../kotlin/fir/tree/generator/Types.kt | 1 + .../classLiteral/inAnnotationArguments.fir.kt | 4 +- .../inAnnotationArguments_noTypeParams.fir.kt | 2 +- .../tests/classLiteral/nonClassesOnLHS.fir.kt | 2 +- .../testsWithStdLib/javaForKClass.fir.kt | 10 ++--- .../reified/reifiedNothingSubstitution.fir.kt | 2 +- .../classLiteralInAnnotation.fir.txt | 6 +-- .../typeParameterClassLiteral.fir.txt | 42 ++++++++---------- 22 files changed, 184 insertions(+), 64 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedReifiedParameterReference.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedReifiedParameterReferenceImpl.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 01ee99dccf1..c0a588e4083 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -1301,10 +1301,20 @@ class Fir2IrVisitor( override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?): IrElement { return getClassCall.convertWithOffsets { startOffset, endOffset -> - IrGetClassImpl( - startOffset, endOffset, getClassCall.typeRef.toIrType(session, declarationStorage), - getClassCall.argument.toIrExpression() - ) + val argument = getClassCall.argument + val irType = getClassCall.typeRef.toIrType(session, declarationStorage) + if (argument is FirResolvedReifiedParameterReference) { + IrClassReferenceImpl( + startOffset, endOffset, irType, + argument.symbol.toTypeParameterSymbol(declarationStorage), + argument.typeRef.toIrType(session, declarationStorage) + ) + } else { + IrGetClassImpl( + startOffset, endOffset, irType, + argument.toIrExpression() + ) + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index a0b3aade537..c232ec8f1f4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedQualifierImpl +import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedReifiedParameterReferenceImpl import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference @@ -202,22 +203,28 @@ class FirCallResolver( is FirNamedReferenceWithCandidate -> nameReference.candidateSymbol else -> null } - if (referencedSymbol is FirClassLikeSymbol<*>) { - val classId = referencedSymbol.classId - return FirResolvedQualifierImpl(nameReference.source, classId.packageFqName, classId.relativeClassName).apply { - resultType = if (classId.isLocal) { - typeForQualifierByDeclaration(referencedSymbol.fir, resultType) - ?: resultType.resolvedTypeFromPrototype( - session.builtinTypes.unitType.type//StandardClassIds.Unit(symbolProvider).constructType(emptyArray(), isNullable = false) - ) - } else { - typeForQualifier(this) + when { + referencedSymbol is FirClassLikeSymbol<*> -> { + val classId = referencedSymbol.classId + return FirResolvedQualifierImpl(nameReference.source, classId.packageFqName, classId.relativeClassName).apply { + resultType = if (classId.isLocal) { + typeForQualifierByDeclaration(referencedSymbol.fir, resultType) + ?: resultType.resolvedTypeFromPrototype( + session.builtinTypes.unitType.type//StandardClassIds.Unit(symbolProvider).constructType(emptyArray(), isNullable = false) + ) + } else { + typeForQualifier(this) + } } } - } - - if (qualifiedAccess.explicitReceiver == null) { - qualifiedResolver.reset() + referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> { + return FirResolvedReifiedParameterReferenceImpl(nameReference.source, referencedSymbol).apply { + resultType = typeForReifiedParameterReference(this) + } + } + qualifiedAccess.explicitReceiver == null -> { + qualifiedResolver.reset() + } } @Suppress("UNCHECKED_CAST") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 0d00b697ac4..852ed786f1f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -11,10 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.FirStubDiagnostic -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.expressions.FirResolvable -import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference @@ -336,6 +333,12 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi ) } +internal fun typeForReifiedParameterReference(parameterReference: FirResolvedReifiedParameterReference): FirTypeRef { + val resultType = parameterReference.resultType + val typeParameterSymbol = parameterReference.symbol + return resultType.resolvedTypeFromPrototype(typeParameterSymbol.constructType(emptyArray(), false)) +} + internal fun typeForQualifierByDeclaration(declaration: FirDeclaration, resultType: FirTypeRef): FirTypeRef? { if (declaration is FirRegularClass) { if (declaration.classKind == ClassKind.OBJECT) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 387ca2fbf14..dda6bce71d8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -386,7 +386,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : val typeOfExpression = when (val lhs = transformedGetClassCall.argument) { is FirResolvedQualifier -> { val classId = lhs.classId - classId?.let { classId -> + if (classId != null) { val symbol = symbolProvider.getClassLikeSymbolByFqName(classId) // TODO: Unify logic? symbol?.constructType( @@ -395,9 +395,17 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : }, isNullable = false ) - } ?: lhs.resultType.coneTypeUnsafe() + } else { + null + } ?: lhs.resultType.coneTypeUnsafe() + } + is FirResolvedReifiedParameterReference -> { + val symbol = lhs.symbol + symbol.constructType(emptyArray(), isNullable = false) + } + else -> { + lhs.resultType.coneTypeUnsafe() } - else -> lhs.resultType.coneTypeUnsafe() } transformedGetClassCall.resultType = diff --git a/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.kt b/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.kt index 5814dff13fd..4336c58cae0 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.kt +++ b/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.kt @@ -1,4 +1,4 @@ inline fun foo(t: T): T { - val klass = T::class.java + val klass = T::class.java return t } \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.txt b/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.txt index e01775fa3fb..5d56dc6d257 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/problems/classLiteralForParameter.txt @@ -1,5 +1,5 @@ FILE: classLiteralForParameter.kt public final inline fun foo(t: R|T|): R|T| { - lval klass: = (R|?|).# + lval klass: R|java/lang/Class| = (R|T|).R|kotlin/jvm/java| ^foo R|/t| } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedReifiedParameterReference.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedReifiedParameterReference.kt new file mode 100644 index 00000000000..95d69a4faf1 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirResolvedReifiedParameterReference.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2019 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.expressions + +import org.jetbrains.kotlin.fir.FirPureAbstractElement +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirResolvedReifiedParameterReference : FirPureAbstractElement(), FirExpression { + abstract override val source: FirSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract val symbol: FirTypeParameterSymbol + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedReifiedParameterReference(this, data) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedReifiedParameterReferenceImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedReifiedParameterReferenceImpl.kt new file mode 100644 index 00000000000..4dc1234e351 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirResolvedReifiedParameterReferenceImpl.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2019 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.expressions.impl + +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirResolvedReifiedParameterReference +import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +class FirResolvedReifiedParameterReferenceImpl( + override val source: FirSourceElement?, + override val symbol: FirTypeParameterSymbol +) : FirResolvedReifiedParameterReference(), FirAbstractAnnotatedElement { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) + override val annotations: MutableList = mutableListOf() + + override fun acceptChildren(visitor: FirVisitor, data: D) { + typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedReifiedParameterReferenceImpl { + typeRef = typeRef.transformSingle(transformer, data) + annotations.transformInplace(transformer, data) + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index f234a524824..2c633344c9a 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -93,6 +93,7 @@ import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.FirResolvedReifiedParameterReference import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression @@ -477,6 +478,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(resolvedReifiedParameterReference, data) + } + open fun transformReturnExpression(returnExpression: FirReturnExpression, data: D): CompositeTransformResult { return transformElement(returnExpression, data) } @@ -929,6 +934,10 @@ abstract class FirTransformer : FirVisitor { + return transformResolvedReifiedParameterReference(resolvedReifiedParameterReference, data) + } + final override fun visitReturnExpression(returnExpression: FirReturnExpression, data: D): CompositeTransformResult { return transformReturnExpression(returnExpression, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index a8e8080a005..98bc3a39967 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -93,6 +93,7 @@ import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.FirResolvedReifiedParameterReference import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression @@ -301,6 +302,8 @@ abstract class FirVisitor { open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): R = visitElement(resolvedQualifier, data) + open fun visitResolvedReifiedParameterReference(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference, data: D): R = visitElement(resolvedReifiedParameterReference, data) + open fun visitReturnExpression(returnExpression: FirReturnExpression, data: D): R = visitElement(returnExpression, data) open fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: D): R = visitElement(stringConcatenationCall, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 6c9e3721b3e..fde6494f6d8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -93,6 +93,7 @@ import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier +import org.jetbrains.kotlin.fir.expressions.FirResolvedReifiedParameterReference import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirThrowExpression @@ -475,6 +476,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(resolvedQualifier) } + open fun visitResolvedReifiedParameterReference(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference) { + visitElement(resolvedReifiedParameterReference) + } + open fun visitReturnExpression(returnExpression: FirReturnExpression) { visitElement(returnExpression) } @@ -927,6 +932,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitResolvedQualifier(resolvedQualifier) } + final override fun visitResolvedReifiedParameterReference(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference, data: Nothing?) { + visitResolvedReifiedParameterReference(resolvedReifiedParameterReference) + } + final override fun visitReturnExpression(returnExpression: FirReturnExpression, data: Nothing?) { visitReturnExpression(returnExpression) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 1ec448b94c5..35405265dc6 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -108,6 +108,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val namedArgumentExpression = element("NamedArgumentExpression", Expression, wrappedArgumentExpression) val resolvedQualifier = element("ResolvedQualifier", Expression, expression) + val resolvedReifiedParameterReference = element("ResolvedReifiedParameterReference", Expression, expression) val returnExpression = element("ReturnExpression", Expression, jump) val stringConcatenationCall = element("StringConcatenationCall", Expression, call, expression) val throwExpression = element("ThrowExpression", Expression, expression) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 65f2f9e9550..83af6ed5e43 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -347,6 +347,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } } + impl(resolvedReifiedParameterReference) + impl(returnExpression) { lateinit("target") default("typeRef", "FirImplicitNothingTypeRef(source)") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 2d25eaf6914..8bce0ee83f0 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -430,6 +430,10 @@ object NodeConfigurator : AbstractFieldConfigurator() { +typeArguments.withTransform() } + resolvedReifiedParameterReference.configure { + +field("symbol", typeParameterSymbolType) + } + stringConcatenationCall.configure { } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index 10b6b0e12a2..ad422600ed9 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -58,6 +58,7 @@ val abstractFirBasedSymbolType = type("fir.symbols", "AbstractFirBasedSymbol") val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol") val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol") val classSymbolType = type("fir.symbols.impl", "FirClassSymbol") +val typeParameterSymbolType = type("fir.symbols.impl", "FirTypeParameterSymbol") val pureAbstractElementType = generatedType("FirPureAbstractElement") val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration") diff --git a/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments.fir.kt index 46b50f7168d..1d6b7d698a9 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments.fir.kt @@ -36,10 +36,10 @@ fun test8() {} inline val T.test9 get() = @AnnArray(arrayOf( - T::class, + T::class, Array::class, Array>>::class )) object {} inline val T.test10 - get() = @AnnArray([T::class]) object {} + get() = @AnnArray([T::class]) object {} diff --git a/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments_noTypeParams.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments_noTypeParams.fir.kt index cda2d9dad0a..c5a135c4bfc 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments_noTypeParams.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/inAnnotationArguments_noTypeParams.fir.kt @@ -6,7 +6,7 @@ annotation class Ann(vararg val k: KClass<*>) inline val T.test get() = @Ann( - T::class, + T::class, Array::class, Array>>::class ) object {} diff --git a/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.fir.kt index a67baf0f668..3619f534be9 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.fir.kt @@ -14,7 +14,7 @@ fun foo() { } inline fun bar() { - val t3 = T?::class + val t3 = T?::class } val m = Map::class diff --git a/compiler/testData/diagnostics/testsWithStdLib/javaForKClass.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/javaForKClass.fir.kt index 2b484f7a656..3a711f417bd 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/javaForKClass.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/javaForKClass.fir.kt @@ -17,11 +17,11 @@ public class A { // types checked by txt file // FILE: 1.kt -inline fun test1() = X::class.java -inline fun test2() = X::class.java -inline fun test3() = X::class.java -inline fun test4() = X::class.java -inline fun test5() = X::class.java +inline fun test1() = X::class.java +inline fun test2() = X::class.java +inline fun test3() = X::class.java +inline fun test4() = X::class.java +inline fun test5() = X::class.java fun test6() = A.getA()::class.java fun test7() = A.getKClass().java diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.fir.kt index 988bf2ee966..0ce9a24f864 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.fir.kt @@ -3,7 +3,7 @@ inline fun foo(block: () -> T): String = block().toString() -inline fun javaClass(): Class = T::class.java +inline fun javaClass(): Class = T::class.java fun box() { val a = arrayOf(null!!) diff --git a/compiler/testData/ir/irText/declarations/annotations/classLiteralInAnnotation.fir.txt b/compiler/testData/ir/irText/declarations/annotations/classLiteralInAnnotation.fir.txt index 9e739393e36..8884cb73a9f 100644 --- a/compiler/testData/ir/irText/declarations/annotations/classLiteralInAnnotation.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/classLiteralInAnnotation.fir.txt @@ -55,7 +55,7 @@ FILE fqName: fileName:/classLiteralInAnnotation.kt BLOCK type=.test2. origin=OBJECT_LITERAL CLASS OBJECT name: modality:FINAL visibility:local superTypes:[kotlin.Any] annotations: - A(klass = GET_CLASS type=kotlin.reflect.KClass) + A(klass = CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]' type=kotlin.reflect.KClass.test2>) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.test2. CONSTRUCTOR visibility:private <> () returnType:kotlin.Any [primary] BLOCK_BODY @@ -70,7 +70,7 @@ FILE fqName: fileName:/classLiteralInAnnotation.kt BLOCK type=.. origin=OBJECT_LITERAL CLASS OBJECT name: modality:FINAL visibility:local superTypes:[kotlin.Any] annotations: - A(klass = GET_CLASS type=kotlin.reflect.KClass) + A(klass = CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]' type=kotlin.reflect.KClass>) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.. CONSTRUCTOR visibility:private <> () returnType:kotlin.Any [primary] BLOCK_BODY @@ -84,7 +84,7 @@ FILE fqName: fileName:/classLiteralInAnnotation.kt BLOCK type=.. origin=OBJECT_LITERAL CLASS OBJECT name: modality:FINAL visibility:local superTypes:[kotlin.Any] annotations: - A(klass = GET_CLASS type=kotlin.reflect.KClass) + A(klass = CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]' type=kotlin.reflect.KClass>) $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.. CONSTRUCTOR visibility:private <> () returnType:kotlin.Any [primary] BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt index be21e90cca0..fe6898516de 100644 --- a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt +++ b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.fir.txt @@ -1,53 +1,47 @@ FILE fqName: fileName:/typeParameterClassLiteral.kt - FUN name:classRefFun visibility:public modality:FINAL () returnType:kotlin.reflect.KClass [inline] + FUN name:classRefFun visibility:public modality:FINAL () returnType:kotlin.reflect.KClass.classRefFun> [inline] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun classRefFun (): kotlin.reflect.KClass [inline] declared in ' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType - FUN name:classRefExtFun visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:kotlin.reflect.KClass [inline] + RETURN type=kotlin.Nothing from='public final fun classRefFun (): kotlin.reflect.KClass.classRefFun> [inline] declared in ' + CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass.classRefFun> + FUN name:classRefExtFun visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:kotlin.reflect.KClass.classRefExtFun> [inline] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any] $receiver: VALUE_PARAMETER name: type:kotlin.Any BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun classRefExtFun (): kotlin.reflect.KClass [inline] declared in ' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType + RETURN type=kotlin.Nothing from='public final fun classRefExtFun (): kotlin.reflect.KClass.classRefExtFun> [inline] declared in ' + CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass.classRefExtFun> PROPERTY name:classRefExtVal visibility:public modality:FINAL [val] - FUN name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KClass + FUN name: visibility:public modality:FINAL <> () returnType:kotlin.reflect.KClass> correspondingProperty: PROPERTY name:classRefExtVal visibility:public modality:FINAL [val] BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass declared in ' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType + RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass> declared in ' + CLASS_REFERENCE 'TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass> CLASS CLASS name:Host modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Host CONSTRUCTOR visibility:public <> () returnType:.Host [primary] BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]' - FUN name:classRefGenericMemberFun visibility:public modality:FINAL ($this:.Host) returnType:kotlin.reflect.KClass [inline] + FUN name:classRefGenericMemberFun visibility:public modality:FINAL ($this:.Host) returnType:kotlin.reflect.KClass.Host.classRefGenericMemberFun> [inline] TYPE_PARAMETER name:TF index:0 variance: superTypes:[kotlin.Any] $this: VALUE_PARAMETER name: type:.Host BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberFun (): kotlin.reflect.KClass [inline] declared in .Host' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType - FUN name:classRefGenericMemberExtFun visibility:public modality:FINAL ($this:.Host, $receiver:kotlin.Any) returnType:kotlin.reflect.KClass [inline] + RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberFun (): kotlin.reflect.KClass.Host.classRefGenericMemberFun> [inline] declared in .Host' + CLASS_REFERENCE 'TYPE_PARAMETER name:TF index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass.Host.classRefGenericMemberFun> + FUN name:classRefGenericMemberExtFun visibility:public modality:FINAL ($this:.Host, $receiver:kotlin.Any) returnType:kotlin.reflect.KClass.Host.classRefGenericMemberExtFun> [inline] TYPE_PARAMETER name:TF index:0 variance: superTypes:[kotlin.Any] $this: VALUE_PARAMETER name: type:.Host $receiver: VALUE_PARAMETER name: type:kotlin.Any BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberExtFun (): kotlin.reflect.KClass [inline] declared in .Host' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType + RETURN type=kotlin.Nothing from='public final fun classRefGenericMemberExtFun (): kotlin.reflect.KClass.Host.classRefGenericMemberExtFun> [inline] declared in .Host' + CLASS_REFERENCE 'TYPE_PARAMETER name:TF index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass.Host.classRefGenericMemberExtFun> PROPERTY name:classRefGenericMemberExtVal visibility:public modality:FINAL [val] - FUN name: visibility:public modality:FINAL <> ($this:.Host) returnType:kotlin.reflect.KClass + FUN name: visibility:public modality:FINAL <> ($this:.Host) returnType:kotlin.reflect.KClass> correspondingProperty: PROPERTY name:classRefGenericMemberExtVal visibility:public modality:FINAL [val] $this: VALUE_PARAMETER name: type:.Host BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass declared in .Host' - GET_CLASS type=kotlin.reflect.KClass - ERROR_CALL 'Unresolved reference: R|?|' type=IrErrorType + RETURN type=kotlin.Nothing from='public final fun (): kotlin.reflect.KClass> declared in .Host' + CLASS_REFERENCE 'TYPE_PARAMETER name:TV index:0 variance: superTypes:[kotlin.Any]' type=kotlin.reflect.KClass> FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any