diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt index d431b05b8f3..874d24dd2f1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt @@ -18,9 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder import com.intellij.psi.PsiElement import com.intellij.psi.stubs.StubElement -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget -import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.MODALITY -import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.VISIBILITY +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.* import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes import org.jetbrains.kotlin.psi.stubs.impl.KotlinClassStubImpl import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl @@ -32,7 +30,6 @@ import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.MemberKind import org.jetbrains.kotlin.serialization.ProtoBuf.Modality -import org.jetbrains.kotlin.serialization.deserialization.AnnotatedCallableKind import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer @@ -98,9 +95,13 @@ private class CallableClsStubBuilder( private fun createModifierListStub() { val isModalityIrrelevant = isTopLevel || isConstructor - val relevantModifiers = if (isModalityIrrelevant) listOf(VISIBILITY) else listOf(VISIBILITY, MODALITY) + val modalityModifiers = if (isModalityIrrelevant) listOf() else listOf(MODALITY) + val constModifiers = if (callableKind == CallableKind.VAL) listOf(CONST) else listOf() - val modifierListStubImpl = createModifierListStubForDeclaration(callableStub, callableProto.getFlags(), relevantModifiers) + val relevantModifiers = listOf(VISIBILITY) + constModifiers + modalityModifiers + val modifierListStubImpl = createModifierListStubForDeclaration( + callableStub, callableProto.getFlags(), relevantModifiers + ) val kind = callableProto.annotatedCallableKind val annotationIds = c.components.annotationLoader.loadCallableAnnotations(protoContainer, callableProto, c.nameResolver, kind) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt index c290b1ec0ea..cfb740a8d76 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt @@ -185,6 +185,12 @@ enum class FlagsToModifiers { override fun getModifiers(flags: Int): JetModifierKeywordToken? { return if (Flags.INNER.get(flags)) JetTokens.INNER_KEYWORD else null } + }, + + CONST { + override fun getModifiers(flags: Int): JetModifierKeywordToken? { + return if (Flags.IS_CONST.get(flags)) JetTokens.CONST_KEYWORD else null + } }; abstract fun getModifiers(flags: Int): JetModifierKeywordToken? diff --git a/idea/testData/decompiler/decompiledText/Const.expected.kt b/idea/testData/decompiler/decompiledText/Const.expected.kt new file mode 100644 index 00000000000..1a024a27b34 --- /dev/null +++ b/idea/testData/decompiler/decompiledText/Const.expected.kt @@ -0,0 +1,9 @@ +// IntelliJ API Decompiler stub source generated from a class file +// Implementation of methods is not available + +package test + +public object Const { + private const final val inObject: kotlin.Int /* compiled code */ +} + diff --git a/idea/testData/decompiler/decompiledText/Const/Const.kt b/idea/testData/decompiler/decompiledText/Const/Const.kt new file mode 100644 index 00000000000..ce3687c610b --- /dev/null +++ b/idea/testData/decompiler/decompiledText/Const/Const.kt @@ -0,0 +1,5 @@ +package test + +object Const { + const private val inObject = 1 +} diff --git a/idea/testData/decompiler/stubBuilder/Const/Const.kt b/idea/testData/decompiler/stubBuilder/Const/Const.kt new file mode 100644 index 00000000000..2c5b0346688 --- /dev/null +++ b/idea/testData/decompiler/stubBuilder/Const/Const.kt @@ -0,0 +1,5 @@ +package test + +object Const { + const private val inObject = 1 +} \ No newline at end of file diff --git a/idea/testData/decompiler/stubBuilder/Const/Const.txt b/idea/testData/decompiler/stubBuilder/Const/Const.txt new file mode 100644 index 00000000000..c80271559af --- /dev/null +++ b/idea/testData/decompiler/stubBuilder/Const/Const.txt @@ -0,0 +1,14 @@ +PsiJetFileStubImpl[package=test] + PACKAGE_DIRECTIVE: + REFERENCE_EXPRESSION:[referencedName=test] + IMPORT_LIST: + OBJECT_DECLARATION:[fqName=test.Const, isCompanion=false, isLocal=false, isObjectLiteral=false, isTopLevel=true, name=Const, superNames=[]] + MODIFIER_LIST:[public] + CLASS_BODY: + PROPERTY:[fqName=test.Const.inObject, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReturnTypeRef=true, isExtension=false, isTopLevel=false, isVar=false, name=inObject] + MODIFIER_LIST:[private final const] + TYPE_REFERENCE: + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Int] diff --git a/idea/testData/stubs/Const.expected b/idea/testData/stubs/Const.expected new file mode 100644 index 00000000000..0e087798c85 --- /dev/null +++ b/idea/testData/stubs/Const.expected @@ -0,0 +1,8 @@ +PsiJetFileStubImpl[package=test] + PACKAGE_DIRECTIVE: + REFERENCE_EXPRESSION:[referencedName=test] + IMPORT_LIST: + OBJECT_DECLARATION:[fqName=test.Const, isCompanion=false, isLocal=false, isObjectLiteral=false, isTopLevel=true, name=Const, superNames=[]] + CLASS_BODY: + PROPERTY:[fqName=test.Const.inObject, hasDelegate=false, hasDelegateExpression=false, hasInitializer=true, hasReturnTypeRef=false, isExtension=false, isTopLevel=false, isVar=false, name=inObject] + MODIFIER_LIST:[private const] diff --git a/idea/testData/stubs/Const.kt b/idea/testData/stubs/Const.kt new file mode 100644 index 00000000000..ce3687c610b --- /dev/null +++ b/idea/testData/stubs/Const.kt @@ -0,0 +1,5 @@ +package test + +object Const { + const private val inObject = 1 +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java index d1aa5f8d7bf..a23440ca2bd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java @@ -65,6 +65,12 @@ public class ClsStubBuilderTestGenerated extends AbstractClsStubBuilderTest { doTest(fileName); } + @TestMetadata("Const") + public void testConst() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/Const/"); + doTest(fileName); + } + @TestMetadata("DataClass") public void testDataClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/DataClass/"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java index 88191677810..4533231dbfb 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java @@ -77,6 +77,12 @@ public class CommonDecompiledTextFromJsMetadataTestGenerated extends AbstractCom doTest(fileName); } + @TestMetadata("Const") + public void testConst() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/Const/"); + doTest(fileName); + } + @TestMetadata("Enum") public void testEnum() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/Enum/"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java index 81d9d2600fc..298af744461 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java @@ -53,6 +53,12 @@ public class CommonDecompiledTextTestGenerated extends AbstractCommonDecompiledT doTest(fileName); } + @TestMetadata("Const") + public void testConst() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/Const/"); + doTest(fileName); + } + @TestMetadata("DependencyOnNestedClasses") public void testDependencyOnNestedClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/DependencyOnNestedClasses/"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/StubBuilderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/StubBuilderTestGenerated.java index 48c41491a3d..da03d2c3c15 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/StubBuilderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/StubBuilderTestGenerated.java @@ -89,6 +89,12 @@ public class StubBuilderTestGenerated extends AbstractStubBuilderTest { doTest(fileName); } + @TestMetadata("Const.kt") + public void testConst() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/stubs/Const.kt"); + doTest(fileName); + } + @TestMetadata("DanglingAnnotations.kt") public void testDanglingAnnotations() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/stubs/DanglingAnnotations.kt");