Support property and field annotations in CallableClsStubBuilder
This commit is contained in:
+20
-6
@@ -18,10 +18,9 @@ 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.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.idea.decompiler.stubBuilder.FlagsToModifiers.MODALITY
|
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.VISIBILITY
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
|
||||||
import org.jetbrains.kotlin.psi.JetSecondaryConstructor
|
|
||||||
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes
|
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes
|
||||||
import org.jetbrains.kotlin.psi.stubs.impl.KotlinClassStubImpl
|
import org.jetbrains.kotlin.psi.stubs.impl.KotlinClassStubImpl
|
||||||
import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl
|
import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl
|
||||||
@@ -33,6 +32,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf
|
|||||||
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind
|
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.MemberKind
|
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.MemberKind
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf.Modality
|
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.NameResolver
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
|
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
|
||||||
|
|
||||||
@@ -101,10 +101,24 @@ private class CallableClsStubBuilder(
|
|||||||
val relevantModifiers = if (isModalityIrrelevant) listOf(VISIBILITY) else listOf(VISIBILITY, MODALITY)
|
val relevantModifiers = if (isModalityIrrelevant) listOf(VISIBILITY) else listOf(VISIBILITY, MODALITY)
|
||||||
|
|
||||||
val modifierListStubImpl = createModifierListStubForDeclaration(callableStub, callableProto.getFlags(), relevantModifiers)
|
val modifierListStubImpl = createModifierListStubForDeclaration(callableStub, callableProto.getFlags(), relevantModifiers)
|
||||||
val annotationIds = c.components.annotationLoader.loadCallableAnnotations(
|
|
||||||
protoContainer, callableProto, c.nameResolver, callableProto.annotatedCallableKind
|
fun createAnnotationStubs(kind: AnnotatedCallableKind) {
|
||||||
)
|
val annotationIds = c.components.annotationLoader.loadCallableAnnotations(protoContainer, callableProto, c.nameResolver, kind)
|
||||||
createAnnotationStubs(annotationIds, modifierListStubImpl, needWrappingAnnotationEntries = isPrimaryConstructor)
|
val target = if (kind == AnnotatedCallableKind.PROPERTY_FIELD) AnnotationUseSiteTarget.FIELD else null
|
||||||
|
createAnnotationStubs(annotationIds,
|
||||||
|
modifierListStubImpl,
|
||||||
|
needWrappingAnnotationEntries = isPrimaryConstructor,
|
||||||
|
target = target)
|
||||||
|
}
|
||||||
|
|
||||||
|
val kind = callableProto.annotatedCallableKind
|
||||||
|
if (kind == AnnotatedCallableKind.PROPERTY) {
|
||||||
|
createAnnotationStubs(AnnotatedCallableKind.PROPERTY_SYNTHETIC_FUNCTION)
|
||||||
|
createAnnotationStubs(AnnotatedCallableKind.PROPERTY_FIELD)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
createAnnotationStubs(kind)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doCreateCallableStub(): StubElement<out PsiElement> {
|
private fun doCreateCallableStub(): StubElement<out PsiElement> {
|
||||||
|
|||||||
+6
-1
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.stubs.StubElement
|
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.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -173,7 +174,8 @@ fun createModifierListStub(
|
|||||||
fun createAnnotationStubs(
|
fun createAnnotationStubs(
|
||||||
annotationIds: List<ClassId>,
|
annotationIds: List<ClassId>,
|
||||||
parent: KotlinStubBaseImpl<*>,
|
parent: KotlinStubBaseImpl<*>,
|
||||||
needWrappingAnnotationEntries: Boolean = false
|
needWrappingAnnotationEntries: Boolean = false,
|
||||||
|
target: AnnotationUseSiteTarget? = null
|
||||||
) {
|
) {
|
||||||
if (annotationIds.isEmpty()) return
|
if (annotationIds.isEmpty()) return
|
||||||
|
|
||||||
@@ -188,6 +190,9 @@ fun createAnnotationStubs(
|
|||||||
shortName = annotationClassId.getShortClassName().ref(),
|
shortName = annotationClassId.getShortClassName().ref(),
|
||||||
hasValueArguments = false
|
hasValueArguments = false
|
||||||
)
|
)
|
||||||
|
if (target != null) {
|
||||||
|
KotlinAnnotationUseSiteTargetStubImpl(annotationEntryStubImpl, StringRef.fromString(target.name())!!)
|
||||||
|
}
|
||||||
val constructorCallee = KotlinPlaceHolderStubImpl<JetConstructorCalleeExpression>(annotationEntryStubImpl, JetStubElementTypes.CONSTRUCTOR_CALLEE)
|
val constructorCallee = KotlinPlaceHolderStubImpl<JetConstructorCalleeExpression>(annotationEntryStubImpl, JetStubElementTypes.CONSTRUCTOR_CALLEE)
|
||||||
val typeReference = KotlinPlaceHolderStubImpl<JetTypeReference>(constructorCallee, JetStubElementTypes.TYPE_REFERENCE)
|
val typeReference = KotlinPlaceHolderStubImpl<JetTypeReference>(constructorCallee, JetStubElementTypes.TYPE_REFERENCE)
|
||||||
createStubForTypeName(annotationClassId, typeReference)
|
createStubForTypeName(annotationClassId, typeReference)
|
||||||
|
|||||||
Reference in New Issue
Block a user