Support property and field annotations in CallableClsStubBuilder

This commit is contained in:
Yan Zhulanow
2015-08-11 20:56:02 +03:00
parent b8d2ba23e3
commit 499d5e1103
2 changed files with 26 additions and 7 deletions
@@ -18,10 +18,9 @@ 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.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetSecondaryConstructor
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes
import org.jetbrains.kotlin.psi.stubs.impl.KotlinClassStubImpl
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.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
@@ -101,10 +101,24 @@ private class CallableClsStubBuilder(
val relevantModifiers = if (isModalityIrrelevant) listOf(VISIBILITY) else listOf(VISIBILITY, MODALITY)
val modifierListStubImpl = createModifierListStubForDeclaration(callableStub, callableProto.getFlags(), relevantModifiers)
val annotationIds = c.components.annotationLoader.loadCallableAnnotations(
protoContainer, callableProto, c.nameResolver, callableProto.annotatedCallableKind
)
createAnnotationStubs(annotationIds, modifierListStubImpl, needWrappingAnnotationEntries = isPrimaryConstructor)
fun createAnnotationStubs(kind: AnnotatedCallableKind) {
val annotationIds = c.components.annotationLoader.loadCallableAnnotations(protoContainer, callableProto, c.nameResolver, kind)
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> {
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.stubs.StubElement
import com.intellij.util.io.StringRef
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.name.ClassId
@@ -173,7 +174,8 @@ fun createModifierListStub(
fun createAnnotationStubs(
annotationIds: List<ClassId>,
parent: KotlinStubBaseImpl<*>,
needWrappingAnnotationEntries: Boolean = false
needWrappingAnnotationEntries: Boolean = false,
target: AnnotationUseSiteTarget? = null
) {
if (annotationIds.isEmpty()) return
@@ -188,6 +190,9 @@ fun createAnnotationStubs(
shortName = annotationClassId.getShortClassName().ref(),
hasValueArguments = false
)
if (target != null) {
KotlinAnnotationUseSiteTargetStubImpl(annotationEntryStubImpl, StringRef.fromString(target.name())!!)
}
val constructorCallee = KotlinPlaceHolderStubImpl<JetConstructorCalleeExpression>(annotationEntryStubImpl, JetStubElementTypes.CONSTRUCTOR_CALLEE)
val typeReference = KotlinPlaceHolderStubImpl<JetTypeReference>(constructorCallee, JetStubElementTypes.TYPE_REFERENCE)
createStubForTypeName(annotationClassId, typeReference)