From 13a7270129fa4d6463087b0b8b7e3a2c1682d335 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 2 Mar 2018 13:12:01 +0300 Subject: [PATCH] Generate type parameter declarations for property accessors This requires "scoped" type parameter symbols, because in the ugly world of descriptors property accessors have no type parameters of their own. --- .../psi2ir/generators/ClassGenerator.kt | 2 +- .../psi2ir/generators/DeclarationGenerator.kt | 58 +++++++-- .../psi2ir/generators/FunctionGenerator.kt | 7 +- .../transformations/InsertImplicitCasts.kt | 45 ++++++- .../kotlin/ir/util/DeepCopyIrTree.kt | 8 +- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 40 ++++-- .../parameters/propertyAccessors.txt | 30 ++++- .../irText/expressions/castToTypeParameter.kt | 24 ++++ .../expressions/castToTypeParameter.txt | 115 ++++++++++++++++++ .../expressions/genericPropertyCall.txt | 5 +- .../implicitCastToTypeParameter.kt | 7 ++ .../implicitCastToTypeParameter.txt | 58 +++++++++ .../expressions/typeParameterClassLiteral.kt | 17 +++ .../expressions/typeParameterClassLiteral.txt | 73 +++++++++++ .../irText/regressions/integerCoercionToT.txt | 10 +- .../kotlin/ir/IrTextTestCaseGenerated.java | 18 +++ 16 files changed, 473 insertions(+), 44 deletions(-) create mode 100644 compiler/testData/ir/irText/expressions/castToTypeParameter.kt create mode 100644 compiler/testData/ir/irText/expressions/castToTypeParameter.txt create mode 100644 compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.kt create mode 100644 compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.txt create mode 100644 compiler/testData/ir/irText/expressions/typeParameterClassLiteral.kt create mode 100644 compiler/testData/ir/irText/expressions/typeParameterClassLiteral.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 90d5562f198..8d557745c1f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -59,7 +59,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe irClass.descriptor.thisAsReceiverParameter ) - declarationGenerator.generateTypeParameterDeclarations(irClass, descriptor.declaredTypeParameters) + declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters) val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject) if (irPrimaryConstructor != null) { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index a3e8aae146d..ad2b8533193 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -75,31 +75,63 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { ) - fun generateTypeParameterDeclarations( + fun generateGlobalTypeParametersDeclarations( irTypeParametersOwner: IrTypeParametersContainer, from: List + ) { + generateTypeParameterDeclarations(irTypeParametersOwner, from) { startOffset, endOffset, typeParameterDescriptor -> + context.symbolTable.declareGlobalTypeParameter( + startOffset, + endOffset, + IrDeclarationOrigin.DEFINED, + typeParameterDescriptor + ) + } + } + + fun generateScopedTypeParameterDeclarations( + irTypeParametersOwner: IrTypeParametersContainer, + from: List + ) { + generateTypeParameterDeclarations(irTypeParametersOwner, from) { startOffset, endOffset, typeParameterDescriptor -> + context.symbolTable.declareScopedTypeParameter( + startOffset, + endOffset, + IrDeclarationOrigin.DEFINED, + typeParameterDescriptor + ) + } + } + + private fun generateTypeParameterDeclarations( + irTypeParametersOwner: IrTypeParametersContainer, + from: List, + declareTypeParameter: (Int, Int, TypeParameterDescriptor) -> IrTypeParameter ) { from.mapTo(irTypeParametersOwner.typeParameters) { typeParameterDescriptor -> val ktTypeParameterDeclaration = DescriptorToSourceUtils.getSourceFromDescriptor(typeParameterDescriptor) val startOffset = ktTypeParameterDeclaration.startOffsetOrUndefined val endOffset = ktTypeParameterDeclaration.endOffsetOrUndefined - declareTypeParameterWithSuperClassifiers(startOffset, endOffset, IrDeclarationOrigin.DEFINED, typeParameterDescriptor) + declareTypeParameter( + startOffset, + endOffset, + typeParameterDescriptor + ).also { irTypeParameter -> + mapSuperClassifiers(typeParameterDescriptor, irTypeParameter) + } } } - private fun declareTypeParameterWithSuperClassifiers( - startOffset: Int, - endOffset: Int, - origin: IrDeclarationOrigin, - descriptor: TypeParameterDescriptor - ) = - context.symbolTable.declareTypeParameter(startOffset, endOffset, origin, descriptor).also { irTypeParameter -> - descriptor.typeConstructor.supertypes.mapNotNullTo(irTypeParameter.superClassifiers) { - it.constructor.declarationDescriptor?.let { - context.symbolTable.referenceClassifier(it) - } + private fun mapSuperClassifiers( + descriptor: TypeParameterDescriptor, + irTypeParameter: IrTypeParameter + ) { + descriptor.typeConstructor.supertypes.mapNotNullTo(irTypeParameter.superClassifiers) { + it.constructor.declarationDescriptor?.let { + context.symbolTable.referenceClassifier(it) } } + } fun generateInitializerBody(scopeOwnerSymbol: IrSymbol, ktBody: KtExpression): IrExpressionBody = createBodyGenerator(scopeOwnerSymbol).generateExpressionBody(ktBody) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt index e4d09316407..3b37aa975f3 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt @@ -83,7 +83,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ktParameterOwner: KtElement?, ktReceiverParameterElement: KtElement? ) { - declarationGenerator.generateTypeParameterDeclarations(irFunction, irFunction.descriptor.typeParameters) + declarationGenerator.generateScopedTypeParameterDeclarations(irFunction, irFunction.descriptor.typeParameters) generateValueParameterDeclarations(irFunction, ktParameterOwner, ktReceiverParameterElement) } @@ -98,6 +98,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio if (ktAccessor != null) IrDeclarationOrigin.DEFINED else IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR, descriptor ).buildWithScope { irAccessor -> + declarationGenerator.generateScopedTypeParameterDeclarations(irAccessor, descriptor.correspondingProperty.typeParameters) generateFunctionParameterDeclarations(irAccessor, ktAccessor ?: ktProperty, ktProperty.receiverTypeReference) val ktBodyExpression = ktAccessor?.bodyExpression irAccessor.body = @@ -117,7 +118,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR, descriptor ).buildWithScope { irAccessor -> - declarationGenerator.generateTypeParameterDeclarations(irAccessor, descriptor.typeParameters) + declarationGenerator.generateScopedTypeParameterDeclarations(irAccessor, descriptor.typeParameters) FunctionGenerator(declarationGenerator).generateSyntheticFunctionParameterDeclarations(irAccessor) irAccessor.body = generateDefaultAccessorBody(ktParameter, descriptor, irAccessor) } @@ -229,7 +230,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio } fun generateSyntheticFunctionParameterDeclarations(irFunction: IrFunction) { - declarationGenerator.generateTypeParameterDeclarations(irFunction, irFunction.descriptor.typeParameters) + declarationGenerator.generateGlobalTypeParametersDeclarations(irFunction, irFunction.descriptor.typeParameters) generateValueParameterDeclarations(irFunction, null, null, withDefaultValues = false) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index 2c04027b3e7..338e76a2cf3 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -17,13 +17,17 @@ package org.jetbrains.kotlin.psi2ir.transformations import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl +import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.psi2ir.containsNull @@ -33,12 +37,43 @@ import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.isNullabilityFlexible import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.types.upperIfFlexible +import java.util.* fun insertImplicitCasts(builtIns: KotlinBuiltIns, element: IrElement, symbolTable: SymbolTable) { element.transformChildren(InsertImplicitCasts(builtIns, symbolTable), null) } class InsertImplicitCasts(private val builtIns: KotlinBuiltIns, private val symbolTable: SymbolTable) : IrElementTransformerVoid() { + private val typeParameterScopes = ArrayDeque>() + + private inline fun runInTypeParameterScope(typeParametersContainer: IrTypeParametersContainer, fn: () -> T): T { + enterTypeParameterScope(typeParametersContainer) + val result = fn() + leaveTypeParameterScope() + return result + } + + private fun enterTypeParameterScope(typeParametersContainer: IrTypeParametersContainer) { + typeParameterScopes.addFirst( + typeParametersContainer.typeParameters.associate { + it.descriptor to it.symbol + } + ) + } + + private fun leaveTypeParameterScope() { + typeParameterScopes.removeFirst() + } + + private fun resolveScopedTypeParameter(classifier: ClassifierDescriptor): IrTypeParameterSymbol? { + if (classifier !is TypeParameterDescriptor) return null + for (scope in typeParameterScopes) { + val local = scope[classifier] + if (local != null) return local + } + return null + } + override fun visitCallableReference(expression: IrCallableReference): IrExpression = expression.transformPostfix { transformReceiverArguments() @@ -110,9 +145,11 @@ class InsertImplicitCasts(private val builtIns: KotlinBuiltIns, private val symb } override fun visitFunction(declaration: IrFunction): IrStatement = - declaration.transformPostfix { - valueParameters.forEach { - it.defaultValue?.coerceInnerExpression(it.descriptor.type) + runInTypeParameterScope(declaration) { + declaration.transformPostfix { + valueParameters.forEach { + it.defaultValue?.coerceInnerExpression(it.descriptor.type) + } } } @@ -205,7 +242,7 @@ class InsertImplicitCasts(private val builtIns: KotlinBuiltIns, private val symb return IrTypeOperatorCallImpl( startOffset, endOffset, targetType, typeOperator, targetType, this, - symbolTable.referenceClassifier(typeDescriptor) + resolveScopedTypeParameter(typeDescriptor) ?: symbolTable.referenceClassifier(typeDescriptor) ) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index 0bf8f77d34b..5415dd50090 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -154,9 +154,15 @@ open class DeepCopyIrTree : IrElementTransformerVoid() { } } + private fun FunctionDescriptor.getTypeParametersToTransform() = + when { + this is PropertyAccessorDescriptor -> correspondingProperty.typeParameters + else -> typeParameters + } + protected fun T.transformParameters(original: T): T = apply { - transformTypeParameters(original, descriptor.typeParameters) + transformTypeParameters(original, descriptor.getTypeParametersToTransform()) transformValueParameters(original) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index eae248d3bc2..27ca8bfb73a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -29,7 +29,7 @@ class SymbolTable { private abstract class SymbolTableBase> { val unboundSymbols = linkedSetOf() - protected abstract fun get(d: D): S? + abstract fun get(d: D): S? protected abstract fun set(d: D, s: S) inline fun declare(d: D, createSymbol: () -> S, createOwner: (S) -> B): B { @@ -45,10 +45,10 @@ class SymbolTable { return createOwner(symbol) } - inline fun referenced(d: D, createSymbol: () -> S): S { + inline fun referenced(d: D, orElse: () -> S): S { val s = get(d) if (s == null) { - val new = createSymbol() + val new = orElse() assert(unboundSymbols.add(new)) { "Symbol for ${new.descriptor} was already referenced" } @@ -149,10 +149,11 @@ class SymbolTable { private val fieldSymbolTable = FlatSymbolTable() private val simpleFunctionSymbolTable = FlatSymbolTable() - private val typeParameterSymbolTable = FlatSymbolTable() + private val globalTypeParameterSymbolTable = FlatSymbolTable() + private val scopedTypeParameterSymbolTable = ScopedSymbolTable() private val valueParameterSymbolTable = ScopedSymbolTable() private val variableSymbolTable = ScopedSymbolTable() - private val scopedSymbolTables = listOf(valueParameterSymbolTable, variableSymbolTable) + private val scopedSymbolTables = listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable) fun declareFile(fileEntry: SourceManager.FileEntry, packageFragmentDescriptor: PackageFragmentDescriptor): IrFile = IrFileImpl(fileEntry, IrFileSymbolImpl(packageFragmentDescriptor)) @@ -250,22 +251,31 @@ class SymbolTable { val unboundSimpleFunctions: Set get() = simpleFunctionSymbolTable.unboundSymbols - fun declareTypeParameter( + fun declareGlobalTypeParameter( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: TypeParameterDescriptor ): IrTypeParameter = - typeParameterSymbolTable.declare( + globalTypeParameterSymbolTable.declare( descriptor, { IrTypeParameterSymbolImpl(descriptor) }, { IrTypeParameterImpl(startOffset, endOffset, origin, it) } ) - fun referenceTypeParameter(descriptor: TypeParameterDescriptor) = - typeParameterSymbolTable.referenced(descriptor) { throw AssertionError("Undefined type parameter referenced: $descriptor") } + fun declareScopedTypeParameter( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + descriptor: TypeParameterDescriptor + ): IrTypeParameter = + scopedTypeParameterSymbolTable.declare( + descriptor, + { IrTypeParameterSymbolImpl(descriptor) }, + { IrTypeParameterImpl(startOffset, endOffset, origin, it) } + ) - val unboundTypeParameters: Set get() = typeParameterSymbolTable.unboundSymbols + val unboundTypeParameters: Set get() = globalTypeParameterSymbolTable.unboundSymbols fun declareValueParameter( startOffset: Int, @@ -288,6 +298,12 @@ class SymbolTable { throw AssertionError("Undefined parameter referenced: $descriptor\n${valueParameterSymbolTable.dump()}") } + fun referenceTypeParameter(classifier: TypeParameterDescriptor): IrTypeParameterSymbol = + scopedTypeParameterSymbolTable.get(classifier) + ?: globalTypeParameterSymbolTable.referenced(classifier) { + throw AssertionError("Undefined type parameter referenced: $classifier") + } + val unboundValueParameters: Set get() = valueParameterSymbolTable.unboundSymbols fun declareVariable(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: VariableDescriptor): IrVariable = @@ -342,9 +358,7 @@ class SymbolTable { fun referenceClassifier(classifier: ClassifierDescriptor): IrClassifierSymbol = when (classifier) { is TypeParameterDescriptor -> - typeParameterSymbolTable.referenced(classifier) { - throw AssertionError("Undefined type parameter referenced: $classifier") - } + referenceTypeParameter(classifier) is ClassDescriptor -> classSymbolTable.referenced(classifier) { IrClassSymbolImpl(classifier) } else -> diff --git a/compiler/testData/ir/irText/declarations/parameters/propertyAccessors.txt b/compiler/testData/ir/irText/declarations/parameters/propertyAccessors.txt index 159561f0f2d..4eb9b675e78 100644 --- a/compiler/testData/ir/irText/declarations/parameters/propertyAccessors.txt +++ b/compiler/testData/ir/irText/declarations/parameters/propertyAccessors.txt @@ -29,18 +29,27 @@ FILE fqName: fileName:/propertyAccessors.kt VALUE_PARAMETER name:value index:0 type:kotlin.Int flags: BLOCK_BODY PROPERTY name:testExt3 type:kotlin.Int visibility:public modality:FINAL flags:val - FUN name: visibility:public modality:FINAL <> ($receiver:T) returnType:Int flags: + FUN name: visibility:public modality:FINAL ($receiver:T) returnType:Int flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $receiver: VALUE_PARAMETER name: type:T flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on T: Int' CONST Int type=kotlin.Int value=42 PROPERTY name:testExt4 type:kotlin.Int visibility:public modality:FINAL flags:var - FUN name: visibility:public modality:FINAL <> ($receiver:T) returnType:Int flags: + FUN name: visibility:public modality:FINAL ($receiver:T) returnType:Int flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $receiver: VALUE_PARAMETER name: type:T flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on T: Int' CONST Int type=kotlin.Int value=42 - FUN name: visibility:public modality:FINAL <> ($receiver:T, value:kotlin.Int) returnType:Unit flags: + FUN name: visibility:public modality:FINAL ($receiver:T, value:kotlin.Int) returnType:Unit flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $receiver: VALUE_PARAMETER name: type:T flags: VALUE_PARAMETER name:value index:0 type:kotlin.Int flags: BLOCK_BODY @@ -91,20 +100,29 @@ FILE fqName: fileName:/propertyAccessors.kt VALUE_PARAMETER name:value index:0 type:kotlin.Int flags: BLOCK_BODY PROPERTY name:testMemExt3 type:kotlin.Int visibility:public modality:FINAL flags:val - FUN name: visibility:public modality:FINAL <> ($this:Host, $receiver:TT) returnType:Int flags: + FUN name: visibility:public modality:FINAL ($this:Host, $receiver:TT) returnType:Int flags: + TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $this: VALUE_PARAMETER name: type:Host flags: $receiver: VALUE_PARAMETER name: type:TT flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on TT: Int' CONST Int type=kotlin.Int value=42 PROPERTY name:testMemExt4 type:kotlin.Int visibility:public modality:FINAL flags:var - FUN name: visibility:public modality:FINAL <> ($this:Host, $receiver:TT) returnType:Int flags: + FUN name: visibility:public modality:FINAL ($this:Host, $receiver:TT) returnType:Int flags: + TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $this: VALUE_PARAMETER name: type:Host flags: $receiver: VALUE_PARAMETER name: type:TT flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on TT: Int' CONST Int type=kotlin.Int value=42 - FUN name: visibility:public modality:FINAL <> ($this:Host, $receiver:TT, value:kotlin.Int) returnType:Unit flags: + FUN name: visibility:public modality:FINAL ($this:Host, $receiver:TT, value:kotlin.Int) returnType:Unit flags: + TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $this: VALUE_PARAMETER name: type:Host flags: $receiver: VALUE_PARAMETER name: type:TT flags: VALUE_PARAMETER name:value index:0 type:kotlin.Int flags: diff --git a/compiler/testData/ir/irText/expressions/castToTypeParameter.kt b/compiler/testData/ir/irText/expressions/castToTypeParameter.kt new file mode 100644 index 00000000000..80d4aa9a966 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/castToTypeParameter.kt @@ -0,0 +1,24 @@ +fun castFun(x: Any) = x as T + +fun Any.castExtFun() = this as T + +val T.castExtVal + get() = this as T + + +class Host { + fun castMemberFun(x: Any) = x as T + + fun castGenericMemberFun(x: Any) = x as TF + + fun Any.castMemberExtFun() = this as T + + fun Any.castGenericMemberExtFun() = this as TF + + val Any.castMemberExtVal + get() = this as T + + val TV.castGenericMemberExtVal + get() = this as TV +} + diff --git a/compiler/testData/ir/irText/expressions/castToTypeParameter.txt b/compiler/testData/ir/irText/expressions/castToTypeParameter.txt new file mode 100644 index 00000000000..f7dbddd4c83 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/castToTypeParameter.txt @@ -0,0 +1,115 @@ +FILE fqName: fileName:/castToTypeParameter.kt + FUN name:castFun visibility:public modality:FINAL (x:kotlin.Any) returnType:T flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + VALUE_PARAMETER name:x index:0 type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castFun(Any): T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'value-parameter x: Any' type=kotlin.Any origin=null + FUN name:castExtFun visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:T flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castExtFun() on Any: T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castExtFun: Any' type=kotlin.Any origin=null + PROPERTY name:castExtVal type:T visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL ($receiver:T) returnType:T flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:T flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on T: T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castExtVal: T' type=T origin=null + CLASS CLASS name:Host modality:FINAL visibility:public flags: + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Host flags: + superClasses: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + CONSTRUCTOR visibility:public <> () returnType:Host flags: + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Host' + FUN name:castMemberFun visibility:public modality:FINAL <> ($this:Host, x:kotlin.Any) returnType:T flags: + $this: VALUE_PARAMETER name: type:Host flags: + VALUE_PARAMETER name:x index:0 type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castMemberFun(Any): T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'value-parameter x: Any' type=kotlin.Any origin=null + FUN name:castGenericMemberFun visibility:public modality:FINAL ($this:Host, x:kotlin.Any) returnType:TF flags: + TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + VALUE_PARAMETER name:x index:0 type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castGenericMemberFun(Any): TF' + TYPE_OP type=TF origin=CAST typeOperand=TF + typeOperand: TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'value-parameter x: Any' type=kotlin.Any origin=null + FUN name:castMemberExtFun visibility:public modality:FINAL <> ($this:Host, $receiver:kotlin.Any) returnType:T flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castMemberExtFun() on Any: T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castMemberExtFun: Any' type=kotlin.Any origin=null + FUN name:castGenericMemberExtFun visibility:public modality:FINAL ($this:Host, $receiver:kotlin.Any) returnType:TF flags: + TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='castGenericMemberExtFun() on Any: TF' + TYPE_OP type=TF origin=CAST typeOperand=TF + typeOperand: TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castGenericMemberExtFun: Any' type=kotlin.Any origin=null + PROPERTY name:castMemberExtVal type:T visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL <> ($this:Host, $receiver:kotlin.Any) returnType:T flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on Any: T' + TYPE_OP type=T origin=CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castMemberExtVal: Any' type=kotlin.Any origin=null + PROPERTY name:castGenericMemberExtVal type:TV visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL ($this:Host, $receiver:TV) returnType:TV flags: + TYPE_PARAMETER name:TV index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:TV flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on TV: TV' + TYPE_OP type=TV origin=CAST typeOperand=TV + typeOperand: TYPE_PARAMETER name:TV index:0 variance: upperBounds:[kotlin.Any?] + GET_VAR 'this@castGenericMemberExtVal: TV' type=TV origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> (other:kotlin.Any?) returnType:Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> () returnType:Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> () returnType:String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: diff --git a/compiler/testData/ir/irText/expressions/genericPropertyCall.txt b/compiler/testData/ir/irText/expressions/genericPropertyCall.txt index c1b10e33111..bd0a49143d9 100644 --- a/compiler/testData/ir/irText/expressions/genericPropertyCall.txt +++ b/compiler/testData/ir/irText/expressions/genericPropertyCall.txt @@ -1,6 +1,9 @@ FILE fqName: fileName:/genericPropertyCall.kt PROPERTY name:id type:T visibility:public modality:FINAL flags:val - FUN name: visibility:public modality:FINAL <> ($receiver:T) returnType:T flags: + FUN name: visibility:public modality:FINAL ($receiver:T) returnType:T flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: $receiver: VALUE_PARAMETER name: type:T flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on T: T' diff --git a/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.kt b/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.kt new file mode 100644 index 00000000000..44407653b51 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.kt @@ -0,0 +1,7 @@ +inline fun Any.test1(): T? = + if (this is T) this else null + +interface Foo + +inline val Foo.asT: T? + get() = if (this is T) this else null \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.txt b/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.txt new file mode 100644 index 00000000000..7c41db60551 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.txt @@ -0,0 +1,58 @@ +FILE fqName: fileName:/implicitCastToTypeParameter.kt + FUN name:test1 visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:T? flags:inline + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='test1() on Any: T?' + WHEN type=T? origin=null + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + GET_VAR 'this@test1: Any' type=kotlin.Any origin=null + then: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + GET_VAR 'this@test1: Any' type=kotlin.Any origin=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: CONST Null type=kotlin.Nothing? value=null + CLASS INTERFACE name:Foo modality:ABSTRACT visibility:public flags: + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Foo flags: + superClasses: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> (other:kotlin.Any?) returnType:Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> () returnType:Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> () returnType:String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + PROPERTY name:asT type:T? visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL ($receiver:Foo) returnType:T? flags:inline + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:Foo flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on Foo: T?' + WHEN type=T? origin=null + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + GET_VAR 'this@asT: Foo' type=Foo origin=null + then: TYPE_OP type=T origin=IMPLICIT_CAST typeOperand=T + typeOperand: TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + GET_VAR 'this@asT: Foo' type=Foo origin=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: CONST Null type=kotlin.Nothing? value=null diff --git a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.kt b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.kt new file mode 100644 index 00000000000..8d14a8d9901 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.kt @@ -0,0 +1,17 @@ +inline fun classRefFun() = T::class + +inline fun Any.classRefExtFun() = T::class + +inline val T.classRefExtVal + get() = T::class + + +class Host { + inline fun classRefGenericMemberFun() = TF::class + + inline fun Any.classRefGenericMemberExtFun() = TF::class + + inline val TV.classRefGenericMemberExtVal + get() = TV::class +} + diff --git a/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.txt b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.txt new file mode 100644 index 00000000000..1648ac34dac --- /dev/null +++ b/compiler/testData/ir/irText/expressions/typeParameterClassLiteral.txt @@ -0,0 +1,73 @@ +FILE fqName: fileName:/typeParameterClassLiteral.kt + FUN name:classRefFun visibility:public modality:FINAL () returnType:KClass flags:inline + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='classRefFun(): KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + FUN name:classRefExtFun visibility:public modality:FINAL ($receiver:kotlin.Any) returnType:KClass flags:inline + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='classRefExtFun() on Any: KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + PROPERTY name:classRefExtVal type:kotlin.reflect.KClass visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL ($receiver:T) returnType:KClass flags:inline + TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $receiver: VALUE_PARAMETER name: type:T flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on T: KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + CLASS CLASS name:Host modality:FINAL visibility:public flags: + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:Host flags: + superClasses: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + CONSTRUCTOR visibility:public <> () returnType:Host flags: + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='Host' + FUN name:classRefGenericMemberFun visibility:public modality:FINAL ($this:Host) returnType:KClass flags:inline + TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='classRefGenericMemberFun(): KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + FUN name:classRefGenericMemberExtFun visibility:public modality:FINAL ($this:Host, $receiver:kotlin.Any) returnType:KClass flags:inline + TYPE_PARAMETER name:TF index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:kotlin.Any flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='classRefGenericMemberExtFun() on Any: KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + PROPERTY name:classRefGenericMemberExtVal type:kotlin.reflect.KClass visibility:public modality:FINAL flags:val + FUN name: visibility:public modality:FINAL ($this:Host, $receiver:TV) returnType:KClass flags:inline + TYPE_PARAMETER name:TV index:0 variance: upperBounds:[kotlin.Any] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags: + $this: VALUE_PARAMETER name: type:Host flags: + $receiver: VALUE_PARAMETER name: type:TV flags: + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on TV: KClass' + CLASS_REFERENCE '' type=kotlin.reflect.KClass + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> (other:kotlin.Any?) returnType:Boolean flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags: + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> () returnType:Int flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags: + overridden: + FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> () returnType:String flags: + $this: VALUE_PARAMETER name: type:kotlin.Any flags: diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.txt b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt index 413341c8137..6427aedfcd9 100644 --- a/compiler/testData/ir/irText/regressions/integerCoercionToT.txt +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt @@ -50,12 +50,18 @@ FILE fqName: fileName:/integerCoercionToT.kt $this: VALUE_PARAMETER name: type:kotlin.Any flags: TYPEALIAS typealias CInt32Var = CInt32VarX type=CInt32VarX PROPERTY name:value type:T_INT visibility:public modality:FINAL flags:var - FUN name: visibility:public modality:FINAL <> ($receiver:CInt32VarX) returnType:T_INT flags: + FUN name: visibility:public modality:FINAL ($receiver:CInt32VarX) returnType:T_INT flags: + TYPE_PARAMETER name:T_INT index:0 variance: upperBounds:[kotlin.Int] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Int modality:FINAL visibility:public flags: $receiver: VALUE_PARAMETER name: type:CInt32VarX flags: BLOCK_BODY RETURN type=kotlin.Nothing from='() on CInt32VarX: T_INT' CALL 'TODO(): Nothing' type=kotlin.Nothing origin=null - FUN name: visibility:public modality:FINAL <> ($receiver:CInt32VarX, value:T_INT) returnType:Unit flags: + FUN name: visibility:public modality:FINAL ($receiver:CInt32VarX, value:T_INT) returnType:Unit flags: + TYPE_PARAMETER name:T_INT index:0 variance: upperBounds:[kotlin.Int] + superClassifiers: + CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Int modality:FINAL visibility:public flags: $receiver: VALUE_PARAMETER name: type:CInt32VarX flags: VALUE_PARAMETER name:value index:0 type:T_INT flags: BLOCK_BODY diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 63082b77952..8bffd5af911 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -621,6 +621,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("castToTypeParameter.kt") + public void testCastToTypeParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/castToTypeParameter.kt"); + doTest(fileName); + } + @TestMetadata("catchParameterAccess.kt") public void testCatchParameterAccess() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/catchParameterAccess.kt"); @@ -765,6 +771,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("implicitCastToTypeParameter.kt") + public void testImplicitCastToTypeParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/implicitCastToTypeParameter.kt"); + doTest(fileName); + } + @TestMetadata("in.kt") public void testIn() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/in.kt"); @@ -981,6 +993,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("typeParameterClassLiteral.kt") + public void testTypeParameterClassLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/typeParameterClassLiteral.kt"); + doTest(fileName); + } + @TestMetadata("values.kt") public void testValues() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/values.kt");