[FIR] Allow annotation instantiation.

This commit disables the frontend error reporting for supported cases.
This commit is contained in:
Mads Ager
2021-11-02 17:17:34 +01:00
committed by TeamCityServer
parent 56d472451c
commit b79ca7d7df
24 changed files with 32 additions and 78 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.expression package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
@@ -37,7 +38,13 @@ object FirConstructorCallChecker : FirFunctionCallChecker() {
klass !is FirRegularClass || klass.classKind != ClassKind.ANNOTATION_CLASS klass !is FirRegularClass || klass.classKind != ClassKind.ANNOTATION_CLASS
} }
) { ) {
reporter.reportOn(expression.source, FirErrors.ANNOTATION_CLASS_CONSTRUCTOR_CALL, context) if (!context.languageVersionSettings.supportsFeature(LanguageFeature.InstantiationOfAnnotationClasses) ||
declarationClass.typeParameterSymbols.isNotEmpty()
) reporter.reportOn(
expression.source,
FirErrors.ANNOTATION_CLASS_CONSTRUCTOR_CALL,
context
)
} }
} }
} }
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,3 +1,4 @@
// Fir2IrLazyClass does not handle methods from java dependencies in declarations.
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
// WITH_RUNTIME // WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,7 +1,9 @@
// With FIR the annotation implementation class is not regenerated as it
// is seen as coming from the same module.
// See IrSourceCompilerForInline.kt:isCallInsideSameModuleAsCallee.
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM_IR // TARGET_BACKEND: JVM_IR
// IGNORE_DEXING // IGNORE_DEXING
// WITH_RUNTIME // WITH_RUNTIME
// !LANGUAGE: +InstantiationOfAnnotationClasses // !LANGUAGE: +InstantiationOfAnnotationClasses
@@ -1,3 +1,4 @@
// Multi-platform not supported with FIR yet.
// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// DONT_TARGET_EXACT_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// IGNORE_BACKEND_MULTI_MODULE: JVM, JVM_MULTI_MODULE_IR_AGAINST_OLD // IGNORE_BACKEND_MULTI_MODULE: JVM, JVM_MULTI_MODULE_IR_AGAINST_OLD
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM // IGNORE_BACKEND: WASM
// IGNORE_BACKEND_MULTI_MODULE: JVM, JVM_MULTI_MODULE_IR_AGAINST_OLD // IGNORE_BACKEND_MULTI_MODULE: JVM, JVM_MULTI_MODULE_IR_AGAINST_OLD
@@ -1,18 +0,0 @@
// WITH_RUNTIME
// SKIP_TXT
// !LANGUAGE: +InstantiationOfAnnotationClasses
import kotlin.reflect.KClass
annotation class A
annotation class B(val int: Int)
annotation class C(val int: Int = 42)
annotation class G<T: Any>(val int: KClass<T>)
fun box() {
val a = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>A()<!>
val b = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>B(4)<!>
val c = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>C()<!>
val foo = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>G(Int::class)<!>
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_RUNTIME // WITH_RUNTIME
// SKIP_TXT // SKIP_TXT
// !LANGUAGE: +InstantiationOfAnnotationClasses // !LANGUAGE: +InstantiationOfAnnotationClasses
@@ -7,8 +7,8 @@ val test1a = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>AbstractClass()<!>
annotation class AnnotationClass annotation class AnnotationClass
typealias Test2 = AnnotationClass typealias Test2 = AnnotationClass
val test2 = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Test2()<!> val test2 = Test2()
val test2a = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>AnnotationClass()<!> val test2a = AnnotationClass()
enum class EnumClass { VALUE1, VALUE2 } enum class EnumClass { VALUE1, VALUE2 }
typealias Test3 = EnumClass typealias Test3 = EnumClass
@@ -21,4 +21,4 @@ annotation class AnnAnn(val i: Array<Ann>)
@AnnAnn(arrayOf(Ann(intArrayOf(1)))) @AnnAnn(arrayOf(Ann(intArrayOf(1))))
@AnnAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>) @AnnAnn(<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>)
class TestAnn class TestAnn
val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(intArrayOf(1))<!> val iAnn = Ann(intArrayOf(1))
@@ -1,27 +0,0 @@
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class Ann(vararg val i: Int)
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)
@Ann(i2)
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
@Ann(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)
@Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>)<!>)
@Ann(*intArrayOf(i2))
@Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)<!>)
@Ann(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>intArrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i<!>, i2, <!ANNOTATION_ARGUMENT_MUST_BE_CONST!>i3<!>)<!>)
class Test
var i = 1
const val i2 = 1
val i3 = foo()
fun foo(): Int = 1
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class AnnAnn(vararg val i: Ann)
@AnnAnn(*arrayOf(Ann(1)))
@AnnAnn(*<!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>arrayOf(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>iAnn<!>)<!>)
class TestAnn
val iAnn = <!ANNOTATION_CLASS_CONSTRUCTOR_CALL!>Ann(1)<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
@Retention(AnnotationRetention.SOURCE) @Retention(AnnotationRetention.SOURCE)
@Repeatable @Repeatable
annotation class Ann(vararg val i: Int) annotation class Ann(vararg val i: Int)