FIR: Correctly handle Java annotations from deserialization

To obtain enhanced declarations, we should use type scope
This commit is contained in:
Denis Zharkov
2020-11-02 20:33:39 +03:00
parent f2b0d057b9
commit a444618c27
2 changed files with 25 additions and 16 deletions
@@ -8,19 +8,19 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.collectEnumEntries import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolvedAnnotations import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolvedAnnotations
import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
import org.jetbrains.kotlin.fir.scopes.getDeclaredConstructors
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -177,19 +177,24 @@ abstract class AbstractAnnotationDeserializer(
var arguments = emptyList<FirExpression>() var arguments = emptyList<FirExpression>()
if (proto.argumentCount != 0 && firAnnotationClass?.classKind == ClassKind.ANNOTATION_CLASS) { if (proto.argumentCount != 0 && firAnnotationClass?.classKind == ClassKind.ANNOTATION_CLASS) {
val constructor = firAnnotationClass.declarations.firstOrNull { it is FirConstructor } val classScope = firAnnotationClass.defaultType()
if (constructor is FirConstructor) { .scope(session, ScopeSession(), FakeOverrideTypeCalculator.DoNothing)
val parameterByName = constructor.valueParameters.associateBy { it.name } ?: error("Null scope for $classId")
arguments = proto.argumentList.mapNotNull { val constructor =
val name = nameResolver.getName(it.nameId) classScope.getDeclaredConstructors().singleOrNull()?.fir ?: error("No single constructor found for $classId")
val parameter = parameterByName[name] ?: return@mapNotNull null
val value = resolveValue(parameter.returnTypeRef.coneType, it.value, nameResolver)
buildNamedArgumentExpression { val parameterByName = constructor.valueParameters.associateBy { it.name }
expression = value
isSpread = false arguments = proto.argumentList.mapNotNull {
this.name = name val name = nameResolver.getName(it.nameId)
} val parameter = parameterByName[name] ?: return@mapNotNull null
val value = resolveValue(parameter.returnTypeRef.coneType, it.value, nameResolver)
buildNamedArgumentExpression {
expression = value
isSpread = false
this.name = name
} }
} }
} }
@@ -43,6 +43,10 @@ fun FirScope.getProperties(name: Name): List<FirVariableSymbol<*>> = mutableList
processPropertiesByName(name, this::add) processPropertiesByName(name, this::add)
} }
fun FirScope.getDeclaredConstructors(): List<FirConstructorSymbol> = mutableListOf<FirConstructorSymbol>().apply {
processDeclaredConstructors(this::add)
}
fun FirTypeScope.processOverriddenFunctionsAndSelf( fun FirTypeScope.processOverriddenFunctionsAndSelf(
functionSymbol: FirFunctionSymbol<*>, functionSymbol: FirFunctionSymbol<*>,
processor: (FirFunctionSymbol<*>) -> ProcessorAction processor: (FirFunctionSymbol<*>) -> ProcessorAction