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 ae0ae88c732..64d6128bff3 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,7 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder import com.intellij.psi.PsiElement import com.intellij.psi.stubs.StubElement -import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.* +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt index 76717292bc1..4cecf43b33c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt @@ -22,7 +22,10 @@ import com.intellij.psi.stubs.StubElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isNumberedFunctionClassFqName import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.* +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.DATA +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.INNER +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.MODALITY +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.VISIBILITY import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.ClassId 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 e617ea41e52..4294f7f0276 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 @@ -22,6 +22,7 @@ import com.intellij.psi.stubs.StubElement import com.intellij.util.io.StringRef import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.SourceElement +import org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags.FlagsToModifiers import org.jetbrains.kotlin.idea.stubindex.KotlinFileStubForIde import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens @@ -164,90 +165,6 @@ fun createStubForTypeName( return recCreateStubForType(parent, level = 0) } -enum class FlagsToModifiers { - MODALITY { - override fun getModifiers(flags: Int): KtModifierKeywordToken { - val modality = Flags.MODALITY.get(flags) - return when (modality) { - ProtoBuf.Modality.ABSTRACT -> KtTokens.ABSTRACT_KEYWORD - ProtoBuf.Modality.FINAL -> KtTokens.FINAL_KEYWORD - ProtoBuf.Modality.OPEN -> KtTokens.OPEN_KEYWORD - ProtoBuf.Modality.SEALED -> KtTokens.SEALED_KEYWORD - null -> throw IllegalStateException("Unexpected modality: null") - } - } - }, - - VISIBILITY { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - val visibility = Flags.VISIBILITY.get(flags) - return when (visibility) { - ProtoBuf.Visibility.PRIVATE, ProtoBuf.Visibility.PRIVATE_TO_THIS -> KtTokens.PRIVATE_KEYWORD - ProtoBuf.Visibility.INTERNAL -> KtTokens.INTERNAL_KEYWORD - ProtoBuf.Visibility.PROTECTED -> KtTokens.PROTECTED_KEYWORD - ProtoBuf.Visibility.PUBLIC -> KtTokens.PUBLIC_KEYWORD - else -> throw IllegalStateException("Unexpected visibility: $visibility") - } - } - }, - - INNER { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_INNER.get(flags)) KtTokens.INNER_KEYWORD else null - } - }, - - CONST { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_CONST.get(flags)) KtTokens.CONST_KEYWORD else null - } - }, - - LATEINIT { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_LATEINIT.get(flags)) KtTokens.LATEINIT_KEYWORD else null - } - }, - - OPERATOR { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_OPERATOR.get(flags)) KtTokens.OPERATOR_KEYWORD else null - } - }, - - INFIX { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_INFIX.get(flags)) KtTokens.INFIX_KEYWORD else null - } - }, - - DATA { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_DATA.get(flags)) KtTokens.DATA_KEYWORD else null - } - }, - - EXTERNAL_FUN { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_EXTERNAL_FUNCTION.get(flags)) KtTokens.EXTERNAL_KEYWORD else null - } - }, - - INLINE { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_INLINE.get(flags)) KtTokens.INLINE_KEYWORD else null - } - }, - - TAILREC { - override fun getModifiers(flags: Int): KtModifierKeywordToken? { - return if (Flags.IS_TAILREC.get(flags)) KtTokens.TAILREC_KEYWORD else null - } - }; - - abstract fun getModifiers(flags: Int): KtModifierKeywordToken? -} - fun createModifierListStubForDeclaration( parent: StubElement, flags: Int, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt new file mode 100644 index 00000000000..fcb61499ea5 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/flags/flags.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.decompiler.stubBuilder.flags + +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.serialization.Flags +import org.jetbrains.kotlin.serialization.ProtoBuf + +abstract class FlagsToModifiers { + abstract fun getModifiers(flags: Int): KtModifierKeywordToken? +} + +val MODALITY: FlagsToModifiers = object : FlagsToModifiers() { + override fun getModifiers(flags: Int): KtModifierKeywordToken { + val modality = Flags.MODALITY.get(flags) + return when (modality) { + ProtoBuf.Modality.ABSTRACT -> KtTokens.ABSTRACT_KEYWORD + ProtoBuf.Modality.FINAL -> KtTokens.FINAL_KEYWORD + ProtoBuf.Modality.OPEN -> KtTokens.OPEN_KEYWORD + ProtoBuf.Modality.SEALED -> KtTokens.SEALED_KEYWORD + null -> throw IllegalStateException("Unexpected modality: null") + } + } +} + +val VISIBILITY: FlagsToModifiers = object : FlagsToModifiers() { + override fun getModifiers(flags: Int): KtModifierKeywordToken? { + val visibility = Flags.VISIBILITY.get(flags) + return when (visibility) { + ProtoBuf.Visibility.PRIVATE, ProtoBuf.Visibility.PRIVATE_TO_THIS -> KtTokens.PRIVATE_KEYWORD + ProtoBuf.Visibility.INTERNAL -> KtTokens.INTERNAL_KEYWORD + ProtoBuf.Visibility.PROTECTED -> KtTokens.PROTECTED_KEYWORD + ProtoBuf.Visibility.PUBLIC -> KtTokens.PUBLIC_KEYWORD + else -> throw IllegalStateException("Unexpected visibility: $visibility") + } + } +} + +val INNER = createBooleanFlagToModifier(Flags.IS_INNER, KtTokens.INNER_KEYWORD) +val CONST = createBooleanFlagToModifier(Flags.IS_CONST, KtTokens.CONST_KEYWORD) +val LATEINIT = createBooleanFlagToModifier(Flags.IS_LATEINIT, KtTokens.LATEINIT_KEYWORD) +val OPERATOR = createBooleanFlagToModifier(Flags.IS_OPERATOR, KtTokens.OPERATOR_KEYWORD) +val INFIX = createBooleanFlagToModifier(Flags.IS_INFIX, KtTokens.INFIX_KEYWORD) +val DATA = createBooleanFlagToModifier(Flags.IS_DATA, KtTokens.DATA_KEYWORD) +val EXTERNAL_FUN = createBooleanFlagToModifier(Flags.IS_EXTERNAL_FUNCTION, KtTokens.EXTERNAL_KEYWORD) +val INLINE = createBooleanFlagToModifier(Flags.IS_INLINE, KtTokens.INLINE_KEYWORD) +val TAILREC = createBooleanFlagToModifier(Flags.IS_TAILREC, KtTokens.TAILREC_KEYWORD) + +private fun createBooleanFlagToModifier( + flagField: Flags.BooleanFlagField, ktModifierKeywordToken: KtModifierKeywordToken +): FlagsToModifiers = BooleanFlagToModifier(flagField, ktModifierKeywordToken) + +private class BooleanFlagToModifier( + private val flagField: Flags.BooleanFlagField, + private val ktModifierKeywordToken: KtModifierKeywordToken +) : FlagsToModifiers() { + override fun getModifiers(flags: Int): KtModifierKeywordToken? = if (flagField.get(flags)) ktModifierKeywordToken else null +}