[FIR] Fix serialization of annotation vararg arguments
#KT-58937 Fixed
This commit is contained in:
committed by
Space Team
parent
fd4d4f516f
commit
8ff67218f5
+6
@@ -60,6 +60,12 @@ public class FirLoadK1CompiledJvmKotlinTestGenerated extends AbstractFirLoadK1Co
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
|
|||||||
+6
@@ -60,6 +60,12 @@ public class FirLoadK2CompiledJvmKotlinTestGenerated extends AbstractFirLoadK2Co
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
|
|||||||
+25
-13
@@ -14,14 +14,15 @@ import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
import org.jetbrains.kotlin.fir.declarations.utils.isConst
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
|
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.render
|
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
||||||
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer.Companion.isArrayOfCall
|
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirArrayOfCallTransformer.Companion.isArrayOfCall
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
|
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||||
|
|
||||||
@@ -49,6 +50,11 @@ internal data class FirToConstantValueTransformerData(
|
|||||||
internal abstract class FirToConstantValueTransformer(
|
internal abstract class FirToConstantValueTransformer(
|
||||||
private val failOnNonConst: Boolean,
|
private val failOnNonConst: Boolean,
|
||||||
) : FirDefaultVisitor<ConstantValue<*>?, FirToConstantValueTransformerData>() {
|
) : FirDefaultVisitor<ConstantValue<*>?, FirToConstantValueTransformerData>() {
|
||||||
|
private fun FirExpression.toConstantValue(data: FirToConstantValueTransformerData): ConstantValue<*>? {
|
||||||
|
return data.constValueProvider?.findConstantValueFor(this)
|
||||||
|
?: accept(this@FirToConstantValueTransformer, data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitElement(
|
override fun visitElement(
|
||||||
element: FirElement,
|
element: FirElement,
|
||||||
data: FirToConstantValueTransformerData
|
data: FirToConstantValueTransformerData
|
||||||
@@ -87,7 +93,7 @@ internal abstract class FirToConstantValueTransformer(
|
|||||||
stringConcatenationCall: FirStringConcatenationCall,
|
stringConcatenationCall: FirStringConcatenationCall,
|
||||||
data: FirToConstantValueTransformerData
|
data: FirToConstantValueTransformerData
|
||||||
): ConstantValue<*>? {
|
): ConstantValue<*>? {
|
||||||
val strings = stringConcatenationCall.argumentList.arguments.map { it.accept(this, data) }
|
val strings = stringConcatenationCall.argumentList.arguments.map { it.toConstantValue(data) }
|
||||||
if (strings.any { it == null || it !is StringValue }) return null
|
if (strings.any { it == null || it !is StringValue }) return null
|
||||||
return StringValue(strings.joinToString(separator = "") { (it as StringValue).value })
|
return StringValue(strings.joinToString(separator = "") { (it as StringValue).value })
|
||||||
}
|
}
|
||||||
@@ -96,7 +102,7 @@ internal abstract class FirToConstantValueTransformer(
|
|||||||
arrayOfCall: FirArrayOfCall,
|
arrayOfCall: FirArrayOfCall,
|
||||||
data: FirToConstantValueTransformerData
|
data: FirToConstantValueTransformerData
|
||||||
): ConstantValue<*> {
|
): ConstantValue<*> {
|
||||||
return ArrayValue(arrayOfCall.argumentList.arguments.mapNotNull { it.accept(this, data) })
|
return ArrayValue(arrayOfCall.argumentList.arguments.mapNotNull { it.toConstantValue(data) })
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitAnnotation(
|
override fun visitAnnotation(
|
||||||
@@ -132,12 +138,12 @@ internal abstract class FirToConstantValueTransformer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
symbol is FirPropertySymbol -> {
|
symbol is FirPropertySymbol -> {
|
||||||
if (symbol.fir.isConst) symbol.fir.initializer?.accept(this, data) else null
|
if (symbol.fir.isConst) symbol.fir.initializer?.toConstantValue(data) else null
|
||||||
}
|
}
|
||||||
|
|
||||||
fir is FirJavaField -> {
|
fir is FirJavaField -> {
|
||||||
if (fir.isFinal) {
|
if (fir.isFinal) {
|
||||||
fir.initializer?.accept(this, data)
|
fir.initializer?.toConstantValue(data)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@@ -156,7 +162,7 @@ internal abstract class FirToConstantValueTransformer(
|
|||||||
|
|
||||||
symbol.callableId.packageName.asString() == "kotlin" -> {
|
symbol.callableId.packageName.asString() == "kotlin" -> {
|
||||||
val dispatchReceiver = qualifiedAccessExpression.dispatchReceiver
|
val dispatchReceiver = qualifiedAccessExpression.dispatchReceiver
|
||||||
val dispatchReceiverValue by lazy { dispatchReceiver.accept(this, data) }
|
val dispatchReceiverValue by lazy { dispatchReceiver.toConstantValue(data) }
|
||||||
when (symbol.callableId.callableName.asString()) {
|
when (symbol.callableId.callableName.asString()) {
|
||||||
"toByte" -> ByteValue((dispatchReceiverValue!!.value as Number).toByte())
|
"toByte" -> ByteValue((dispatchReceiverValue!!.value as Number).toByte())
|
||||||
"toLong" -> LongValue((dispatchReceiverValue!!.value as Number).toLong())
|
"toLong" -> LongValue((dispatchReceiverValue!!.value as Number).toLong())
|
||||||
@@ -201,16 +207,22 @@ internal abstract class FirToConstantValueTransformer(
|
|||||||
|
|
||||||
override fun visitVarargArgumentsExpression(
|
override fun visitVarargArgumentsExpression(
|
||||||
varargArgumentsExpression: FirVarargArgumentsExpression,
|
varargArgumentsExpression: FirVarargArgumentsExpression,
|
||||||
data: FirToConstantValueTransformerData
|
data: FirToConstantValueTransformerData,
|
||||||
): ConstantValue<*> {
|
): ConstantValue<*> {
|
||||||
return ArrayValue(varargArgumentsExpression.arguments.mapNotNull { it.accept(this, data) })
|
val arguments = varargArgumentsExpression.arguments.let {
|
||||||
|
// Named, spread or array literal arguments for vararg parameters have the form Vararg(Named/Spread?(ArrayOfCall(..))).
|
||||||
|
// We need to extract the ArrayOfCall, otherwise we will get two nested ArrayValue as a result.
|
||||||
|
(it.singleOrNull()?.unwrapArgument() as? FirArrayOfCall)?.arguments ?: it
|
||||||
|
}
|
||||||
|
|
||||||
|
return ArrayValue(arguments.mapNotNull { it.toConstantValue(data) })
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitNamedArgumentExpression(
|
override fun visitWrappedArgumentExpression(
|
||||||
namedArgumentExpression: FirNamedArgumentExpression,
|
wrappedArgumentExpression: FirWrappedArgumentExpression,
|
||||||
data: FirToConstantValueTransformerData
|
data: FirToConstantValueTransformerData,
|
||||||
): ConstantValue<*>? {
|
): ConstantValue<*>? {
|
||||||
return namedArgumentExpression.expression.accept(this, data)
|
return wrappedArgumentExpression.expression.toConstantValue(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-5
@@ -5,8 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.fakeElement
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
@@ -45,6 +44,10 @@ internal fun remapArgumentsWithVararg(
|
|||||||
//todo ideally we should use here a source from the use-site and not from the declaration-site
|
//todo ideally we should use here a source from the use-site and not from the declaration-site
|
||||||
this.varargElementType = varargParameterTypeRef.withReplacedConeType(varargElementType, KtFakeSourceElementKind.VarargArgument)
|
this.varargElementType = varargParameterTypeRef.withReplacedConeType(varargElementType, KtFakeSourceElementKind.VarargArgument)
|
||||||
this.typeRef = varargParameterTypeRef.withReplacedConeType(varargArrayType, KtFakeSourceElementKind.VarargArgument)
|
this.typeRef = varargParameterTypeRef.withReplacedConeType(varargArrayType, KtFakeSourceElementKind.VarargArgument)
|
||||||
|
var startOffset = Int.MAX_VALUE
|
||||||
|
var endOffset = 0
|
||||||
|
var firstVarargElementSource: KtSourceElement? = null
|
||||||
|
|
||||||
for ((i, arg) in argumentList.withIndex()) {
|
for ((i, arg) in argumentList.withIndex()) {
|
||||||
val valueParameter = argumentMapping.getValue(arg)
|
val valueParameter = argumentMapping.getValue(arg)
|
||||||
// Collect arguments if `arg` is a vararg argument of interest or other vararg arguments.
|
// Collect arguments if `arg` is a vararg argument of interest or other vararg arguments.
|
||||||
@@ -53,9 +56,9 @@ internal fun remapArgumentsWithVararg(
|
|||||||
(valueParameter.isVararg && arg !is FirNamedArgumentExpression)
|
(valueParameter.isVararg && arg !is FirNamedArgumentExpression)
|
||||||
) {
|
) {
|
||||||
arguments += arg
|
arguments += arg
|
||||||
if (this.source == null) {
|
startOffset = minOf(startOffset, arg.source?.startOffset ?: Int.MAX_VALUE)
|
||||||
this.source = arg.source?.fakeElement(KtFakeSourceElementKind.VarargArgument)
|
endOffset = maxOf(endOffset, arg.source?.endOffset ?: 0)
|
||||||
}
|
if (firstVarargElementSource == null) firstVarargElementSource = arg.source
|
||||||
} else if (arguments.isEmpty()) {
|
} else if (arguments.isEmpty()) {
|
||||||
// `arg` is BEFORE the vararg arguments.
|
// `arg` is BEFORE the vararg arguments.
|
||||||
newArgumentMapping[arg] = valueParameter
|
newArgumentMapping[arg] = valueParameter
|
||||||
@@ -65,6 +68,8 @@ internal fun remapArgumentsWithVararg(
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
source = firstVarargElementSource?.fakeElement(KtFakeSourceElementKind.VarargArgument, startOffset, endOffset)
|
||||||
}
|
}
|
||||||
newArgumentMapping[varargArgument] = varargParameter
|
newArgumentMapping[varargArgument] = varargParameter
|
||||||
|
|
||||||
|
|||||||
@@ -422,7 +422,10 @@ class KtRealPsiSourceElement(psi: PsiElement) : KtPsiSourceElement(psi) {
|
|||||||
override val kind: KtSourceElementKind get() = KtRealSourceElementKind
|
override val kind: KtSourceElementKind get() = KtRealSourceElementKind
|
||||||
}
|
}
|
||||||
|
|
||||||
class KtFakeSourceElement(psi: PsiElement, override val kind: KtFakeSourceElementKind) : KtPsiSourceElement(psi) {
|
open class KtFakeSourceElement(
|
||||||
|
psi: PsiElement,
|
||||||
|
override val kind: KtFakeSourceElementKind,
|
||||||
|
) : KtPsiSourceElement(psi) {
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (javaClass != other?.javaClass) return false
|
if (javaClass != other?.javaClass) return false
|
||||||
@@ -442,11 +445,49 @@ class KtFakeSourceElement(psi: PsiElement, override val kind: KtFakeSourceElemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtSourceElement.fakeElement(newKind: KtFakeSourceElementKind): KtSourceElement {
|
private class KtFakeSourceElementWithOffsets(
|
||||||
|
psi: PsiElement,
|
||||||
|
kind: KtFakeSourceElementKind,
|
||||||
|
override val startOffset: Int,
|
||||||
|
override val endOffset: Int,
|
||||||
|
) : KtFakeSourceElement(psi, kind) {
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (other !is KtFakeSourceElementWithOffsets) return false
|
||||||
|
if (!super.equals(other)) return false
|
||||||
|
|
||||||
|
if (kind != other.kind) return false
|
||||||
|
if (startOffset != other.startOffset) return false
|
||||||
|
return endOffset == other.endOffset
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = super.hashCode()
|
||||||
|
result = 31 * result + kind.hashCode()
|
||||||
|
result = 31 * result + startOffset
|
||||||
|
result = 31 * result + endOffset
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KtSourceElement.fakeElement(
|
||||||
|
newKind: KtFakeSourceElementKind,
|
||||||
|
startOffset: Int = -1,
|
||||||
|
endOffset: Int = -1,
|
||||||
|
): KtSourceElement {
|
||||||
if (kind == newKind) return this
|
if (kind == newKind) return this
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is KtLightSourceElement -> KtLightSourceElement(lighterASTNode, startOffset, endOffset, treeStructure, newKind)
|
is KtLightSourceElement -> KtLightSourceElement(
|
||||||
is KtPsiSourceElement -> KtFakeSourceElement(psi, newKind)
|
lighterASTNode,
|
||||||
|
if (startOffset != -1) startOffset else this.startOffset,
|
||||||
|
if (endOffset != -1) endOffset else this.endOffset,
|
||||||
|
treeStructure,
|
||||||
|
newKind
|
||||||
|
)
|
||||||
|
is KtPsiSourceElement -> when {
|
||||||
|
startOffset != -1 && endOffset != -1 -> KtFakeSourceElementWithOffsets(psi, newKind, startOffset, endOffset)
|
||||||
|
else -> KtFakeSourceElement(psi, newKind)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
public final annotation class A : R|kotlin/Annotation| {
|
||||||
|
public final val s: R|kotlin/Array<out kotlin/String>|
|
||||||
|
public get(): R|kotlin/Array<out kotlin/String>|
|
||||||
|
|
||||||
|
public constructor(vararg s: R|kotlin/Array<out kotlin/String>|): R|test/A|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class B : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/B|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class D : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/D|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class E : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/E|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class F : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/F|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class H : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/H|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class I : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/I|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@R|test/A|(s = <implicitArrayOf>(String(1), String(2))) public final class J : R|kotlin/Any| {
|
||||||
|
public constructor(): R|test/J|
|
||||||
|
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
annotation class A(vararg val s: String)
|
||||||
|
|
||||||
|
@A("1", "2")
|
||||||
|
class B
|
||||||
|
|
||||||
|
@A(*["1", "2"])
|
||||||
|
class D
|
||||||
|
|
||||||
|
@A(s = ["1", "2"])
|
||||||
|
class E
|
||||||
|
|
||||||
|
@A(s = *["1", "2"])
|
||||||
|
class F
|
||||||
|
|
||||||
|
@A(*arrayOf("1", "2"))
|
||||||
|
class H
|
||||||
|
|
||||||
|
@A(s = *arrayOf("1", "2"))
|
||||||
|
class I
|
||||||
|
|
||||||
|
@A(s = arrayOf("1", "2"))
|
||||||
|
class J
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
public final annotation class A : kotlin.Annotation {
|
||||||
|
/*primary*/ public constructor A(/*0*/ vararg s: kotlin.String /*kotlin.Array<out kotlin.String>*/)
|
||||||
|
public final val s: kotlin.Array<out kotlin.String>
|
||||||
|
public final fun `<get-s>`(): kotlin.Array<out kotlin.String>
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class B {
|
||||||
|
/*primary*/ public constructor B()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class D {
|
||||||
|
/*primary*/ public constructor D()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class E {
|
||||||
|
/*primary*/ public constructor E()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class F {
|
||||||
|
/*primary*/ public constructor F()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class H {
|
||||||
|
/*primary*/ public constructor H()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class I {
|
||||||
|
/*primary*/ public constructor I()
|
||||||
|
}
|
||||||
|
|
||||||
|
@test.A(s = {"1", "2"}) public final class J {
|
||||||
|
/*primary*/ public constructor J()
|
||||||
|
}
|
||||||
+1
-1
@@ -3,7 +3,7 @@ public final val bar: R|kotlin/Int|
|
|||||||
|
|
||||||
@R|test/Anno|() public final fun baz(): R|kotlin/Unit|
|
@R|test/Anno|() public final fun baz(): R|kotlin/Unit|
|
||||||
|
|
||||||
@R|test/Anno|(t = String(live)) public final fun foo(): R|kotlin/Unit|
|
@R|test/Anno|(t = <implicitArrayOf>(String(live), String(long))) public final fun foo(): R|kotlin/Unit|
|
||||||
|
|
||||||
public final annotation class Anno : R|kotlin/Annotation| {
|
public final annotation class Anno : R|kotlin/Annotation| {
|
||||||
public final val t: R|kotlin/Array<out kotlin/String>|
|
public final val t: R|kotlin/Array<out kotlin/String>|
|
||||||
|
|||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
@R|test/OptionGroups|(o1 = @R|test/StringOptions|(option = <implicitArrayOf>(String(abc), String(d), String(ef))) , o2 = @R|test/EnumOption|(option = R|test/E.ENTRY|) ) public final class AnnotationInAnnotationArguments : R|kotlin/Any| {
|
|
||||||
public constructor(): R|test/AnnotationInAnnotationArguments|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final enum class E : R|kotlin/Enum<test/E>| {
|
|
||||||
private constructor(): R|test/E|
|
|
||||||
|
|
||||||
public final static enum entry ENTRY: R|test/E|
|
|
||||||
public final static fun values(): R|kotlin/Array<test/E>| {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static val entries: R|kotlin/enums/EnumEntries<test/E>|
|
|
||||||
public get(): R|kotlin/enums/EnumEntries<test/E>|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class EnumOption : R|kotlin/Annotation| {
|
|
||||||
public final val option: R|test/E|
|
|
||||||
public get(): R|test/E|
|
|
||||||
|
|
||||||
public constructor(option: R|test/E|): R|test/EnumOption|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class OptionGroups : R|kotlin/Annotation| {
|
|
||||||
public final val o1: R|test/StringOptions|
|
|
||||||
public get(): R|test/StringOptions|
|
|
||||||
|
|
||||||
public final val o2: R|test/EnumOption|
|
|
||||||
public get(): R|test/EnumOption|
|
|
||||||
|
|
||||||
public constructor(o1: R|test/StringOptions|, o2: R|test/EnumOption|): R|test/OptionGroups|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class StringOptions : R|kotlin/Annotation| {
|
|
||||||
public final val option: R|kotlin/Array<out kotlin/String>|
|
|
||||||
public get(): R|kotlin/Array<out kotlin/String>|
|
|
||||||
|
|
||||||
public constructor(vararg option: R|kotlin/Array<out kotlin/String>|): R|test/StringOptions|
|
|
||||||
|
|
||||||
}
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
@R|test/OptionGroups|(o1 = @R|test/StringOptions|(option = String(abc)) , o2 = @R|test/EnumOption|(option = R|test/E.ENTRY|) ) public final class AnnotationInAnnotationArguments : R|kotlin/Any| {
|
|
||||||
public constructor(): R|test/AnnotationInAnnotationArguments|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final enum class E : R|kotlin/Enum<test/E>| {
|
|
||||||
private constructor(): R|test/E|
|
|
||||||
|
|
||||||
public final static enum entry ENTRY: R|test/E|
|
|
||||||
public final static fun values(): R|kotlin/Array<test/E>| {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static val entries: R|kotlin/enums/EnumEntries<test/E>|
|
|
||||||
public get(): R|kotlin/enums/EnumEntries<test/E>|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class EnumOption : R|kotlin/Annotation| {
|
|
||||||
public final val option: R|test/E|
|
|
||||||
public get(): R|test/E|
|
|
||||||
|
|
||||||
public constructor(option: R|test/E|): R|test/EnumOption|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class OptionGroups : R|kotlin/Annotation| {
|
|
||||||
public final val o1: R|test/StringOptions|
|
|
||||||
public get(): R|test/StringOptions|
|
|
||||||
|
|
||||||
public final val o2: R|test/EnumOption|
|
|
||||||
public get(): R|test/EnumOption|
|
|
||||||
|
|
||||||
public constructor(o1: R|test/StringOptions|, o2: R|test/EnumOption|): R|test/OptionGroups|
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public final annotation class StringOptions : R|kotlin/Annotation| {
|
|
||||||
public final val option: R|kotlin/Array<out kotlin/String>|
|
|
||||||
public get(): R|kotlin/Array<out kotlin/String>|
|
|
||||||
|
|
||||||
public constructor(vararg option: R|kotlin/Array<out kotlin/String>|): R|test/StringOptions|
|
|
||||||
|
|
||||||
}
|
|
||||||
Vendored
-1
@@ -1,4 +1,3 @@
|
|||||||
// PLATFORM_DEPENDANT_METADATA
|
|
||||||
// ALLOW_AST_ACCESS
|
// ALLOW_AST_ACCESS
|
||||||
package test
|
package test
|
||||||
|
|
||||||
|
|||||||
+5
@@ -1749,6 +1749,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
||||||
|
|||||||
Generated
+5
@@ -61,6 +61,11 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
||||||
|
|||||||
+5
@@ -1750,6 +1750,11 @@ public class IrLoadJavaTestGenerated extends AbstractIrLoadJavaTest {
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
||||||
|
|||||||
Generated
+5
@@ -1749,6 +1749,11 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
||||||
|
|||||||
+5
@@ -63,6 +63,11 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
|
||||||
|
|||||||
Generated
+6
@@ -60,6 +60,12 @@ public class FirLoadK2CompiledJsKotlinTestGenerated extends AbstractFirLoadK2Com
|
|||||||
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("AnnotationWithVarargParam.kt")
|
||||||
|
public void testAnnotationWithVarargParam() throws Exception {
|
||||||
|
runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationWithVarargParam.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("ClassLiteralArguments.kt")
|
@TestMetadata("ClassLiteralArguments.kt")
|
||||||
public void testClassLiteralArguments() throws Exception {
|
public void testClassLiteralArguments() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user