diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 5b73cef9506..2a98dfb8c84 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -11,8 +11,13 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl +import org.jetbrains.kotlin.fir.declarations.visibility +import org.jetbrains.kotlin.fir.generateValueOfFunction +import org.jetbrains.kotlin.fir.generateValuesFunction import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor import org.jetbrains.kotlin.fir.java.declarations.FirJavaField @@ -284,6 +289,11 @@ class JavaSymbolProvider( } } } + + if (classKind == ClassKind.ENUM_CLASS) { + generateValuesFunction(session, classId.packageFqName, classId.relativeClassName) + generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName) + } } } } diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 5c24f9b56bf..1ab60e78206 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -13,9 +13,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.NAME_FOR_DEFAULT_VALUE_PARAMETER +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.builder.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.* diff --git a/compiler/fir/resolve/testData/enhancement/signatureAnnotations/DefaultEnum.fir.txt b/compiler/fir/resolve/testData/enhancement/signatureAnnotations/DefaultEnum.fir.txt index 6cfb1381d47..e33ca9da8b0 100644 --- a/compiler/fir/resolve/testData/enhancement/signatureAnnotations/DefaultEnum.fir.txt +++ b/compiler/fir/resolve/testData/enhancement/signatureAnnotations/DefaultEnum.fir.txt @@ -13,6 +13,12 @@ public/*package*/ open class A : R|kotlin/Any| { public final enum class Mixed : R|kotlin/Enum| { public final static field NOT_ENTRY_EITHER: R|ft!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|Mixed| { + } + } public final enum class Signs : R|kotlin/Enum| { public final static field HELLO: R|ft!| @@ -21,4 +27,10 @@ public final enum class Signs : R|kotlin/Enum| { public final static field X: R|ft!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|Signs| { + } + } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.kt b/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.kt new file mode 100644 index 00000000000..d93ae69b2f3 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.kt @@ -0,0 +1,10 @@ +// FILE: JavaEnum.java +public enum JavaEnum { + X, Y +} + +// FILE: main.kt +fun foo() { + JavaEnum.values() + JavaEnum.valueOf("") +} diff --git a/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.txt b/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.txt new file mode 100644 index 00000000000..771090cf724 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.txt @@ -0,0 +1,5 @@ +FILE: main.kt + public final fun foo(): R|kotlin/Unit| { + Q|JavaEnum|.R|/JavaEnum.values|() + Q|JavaEnum|.R|/JavaEnum.valueOf|(String()) + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index 2019c115d62..271f4f6928f 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -103,6 +103,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/resolve/testData/resolve/stdlib/implicitReceiverOrder.kt"); } + @TestMetadata("javaEnumSynthetic.kt") + public void testJavaEnumSynthetic() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/stdlib/javaEnumSynthetic.kt"); + } + @TestMetadata("listPlusAssign.kt") public void testListPlusAssign() throws Exception { runTest("compiler/fir/resolve/testData/resolve/stdlib/listPlusAssign.kt"); diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/EnumClassUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt similarity index 86% rename from compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/EnumClassUtils.kt rename to compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt index 2658e57fa51..40383edbfc8 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/EnumClassUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt @@ -3,14 +3,14 @@ * 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.builder +package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.addDeclaration +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass +import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock @@ -29,14 +29,14 @@ private val ENUM_VALUES = Name.identifier("values") private val ENUM_VALUE_OF = Name.identifier("valueOf") private val VALUE = Name.identifier("value") -fun FirModifiableRegularClass.generateValuesFunction( +fun FirModifiableClass.generateValuesFunction( session: FirSession, packageFqName: FqName, classFqName: FqName ) { val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUES)) val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply { isStatic = true } - addDeclaration( + declarations += FirSimpleFunctionImpl( source, session, FirResolvedTypeRefImpl( @@ -50,19 +50,19 @@ fun FirModifiableRegularClass.generateValuesFunction( ), null, ENUM_VALUES, status, symbol ).apply { + resolvePhase = FirResolvePhase.BODY_RESOLVE body = FirEmptyExpressionBlock() } - ) } -fun FirModifiableRegularClass.generateValueOfFunction( +fun FirModifiableClass.generateValueOfFunction( session: FirSession, packageFqName: FqName, classFqName: FqName ) { val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUE_OF)) val status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply { isStatic = true } - addDeclaration( + declarations += FirSimpleFunctionImpl( source, session, FirResolvedTypeRefImpl( @@ -74,6 +74,7 @@ fun FirModifiableRegularClass.generateValueOfFunction( ), null, ENUM_VALUE_OF, status, symbol ).apply { + resolvePhase = FirResolvePhase.BODY_RESOLVE valueParameters += FirValueParameterImpl( source, session, FirImplicitStringTypeRef(source), VALUE, FirVariableSymbol(VALUE), @@ -81,5 +82,4 @@ fun FirModifiableRegularClass.generateValueOfFunction( ) body = FirEmptyExpressionBlock() } - ) } diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt index aaeaaa21ca4..eae7a65bb70 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt @@ -5,4 +5,10 @@ public final enum class AnnotatedEnumEntry : R|kotlin/Enum!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/AnnotatedEnumEntry| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt index 6b2b6c726c2..80948008925 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt @@ -5,4 +5,10 @@ public final enum class EnumConstructorParameter : R|kotlin/Enum| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/EnumConstructorParameter| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt index 1742599bc40..296adcc0a6d 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt @@ -9,4 +9,10 @@ public final enum class EnumMembers : R|kotlin/Enum| { private constructor(isFirst: R|kotlin/Boolean|): R|test/EnumMembers| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/EnumMembers| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt index 464da9110c3..88b041979ad 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt @@ -3,4 +3,10 @@ public open enum class EnumWithSpecializedEntry : R|kotlin/Enum!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/EnumWithSpecializedEntry| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt index 9bf81a65732..f3d233d9b69 100644 --- a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt @@ -3,4 +3,10 @@ public final enum class JavaEnum : R|kotlin/Enum| { public final static field ANOTHER: R|ft!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/JavaEnum| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt index bf3e4bf91f5..bc4399f8fa4 100644 --- a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt @@ -5,4 +5,10 @@ public final enum class Enum : R|kotlin/Enum| { public final static field C: R|ft!| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Enum| { + } + } diff --git a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt index 653e050fcf6..7faa68bf2ea 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt @@ -9,6 +9,12 @@ public final enum class StaticMembersInEnum : R|kotlin/Enum| { + } + public open static operator fun valueOf(x: R|kotlin/Int|): R|kotlin/Unit| + public final static fun valueOf(value: R|kotlin/String|): R|test/StaticMembersInEnum| { + } + }