Change FlagsToModifiers from enum to abstract
Add 2 non-trivial implementations and one for boolean flags
This commit is contained in:
+1
-1
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.stubs.StubElement
|
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.name.Name
|
||||||
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
|
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
|
||||||
import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl
|
import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl
|
||||||
|
|||||||
+4
-1
@@ -22,7 +22,10 @@ import com.intellij.psi.stubs.StubElement
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.isNumberedFunctionClassFqName
|
import org.jetbrains.kotlin.builtins.isNumberedFunctionClassFqName
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
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.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|||||||
+1
-84
@@ -22,6 +22,7 @@ import com.intellij.psi.stubs.StubElement
|
|||||||
import com.intellij.util.io.StringRef
|
import com.intellij.util.io.StringRef
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
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.idea.stubindex.KotlinFileStubForIde
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -164,90 +165,6 @@ fun createStubForTypeName(
|
|||||||
return recCreateStubForType(parent, level = 0)
|
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(
|
fun createModifierListStubForDeclaration(
|
||||||
parent: StubElement<out PsiElement>,
|
parent: StubElement<out PsiElement>,
|
||||||
flags: Int,
|
flags: Int,
|
||||||
|
|||||||
+73
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user