[FIR] Add two kinds of Java origin to distinguish source and library declarations

This commit is contained in:
Dmitriy Novozhilov
2022-05-26 12:04:36 +03:00
committed by teamcity
parent 26df9d74e8
commit fb57e1ecd5
21 changed files with 84 additions and 47 deletions
@@ -50,7 +50,7 @@ internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (ori
} }
FirDeclarationOrigin.Precompiled -> KtSymbolOrigin.SOURCE FirDeclarationOrigin.Precompiled -> KtSymbolOrigin.SOURCE
FirDeclarationOrigin.Library, FirDeclarationOrigin.BuiltIns -> KtSymbolOrigin.LIBRARY FirDeclarationOrigin.Library, FirDeclarationOrigin.BuiltIns -> KtSymbolOrigin.LIBRARY
FirDeclarationOrigin.Java -> KtSymbolOrigin.JAVA is FirDeclarationOrigin.Java -> KtSymbolOrigin.JAVA
FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR
FirDeclarationOrigin.Enhancement -> KtSymbolOrigin.JAVA FirDeclarationOrigin.Enhancement -> KtSymbolOrigin.JAVA
FirDeclarationOrigin.IntersectionOverride -> KtSymbolOrigin.INTERSECTION_OVERRIDE FirDeclarationOrigin.IntersectionOverride -> KtSymbolOrigin.INTERSECTION_OVERRIDE
@@ -82,7 +82,7 @@ internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSessi
val containingClass = getContainingClassSymbol(useSiteSession) ?: return null val containingClass = getContainingClassSymbol(useSiteSession) ?: return null
// Java static members, enums, and object members can be imported // Java static members, enums, and object members can be imported
val canBeImported = containingClass.origin == FirDeclarationOrigin.Java || val canBeImported = containingClass.origin is FirDeclarationOrigin.Java ||
containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.classKind == ClassKind.ENUM_CLASS ||
containingClass.classKind == ClassKind.OBJECT containingClass.classKind == ClassKind.OBJECT
@@ -1,13 +1,13 @@
C: C:
[Java]: public open field x: R|kotlin/Int| from Java enhancement scope for /C [id: 0] [Java(Source)]: public open field x: R|kotlin/Int| from Java enhancement scope for /C [id: 0]
[Java]: private open field y: R|kotlin/Int| from Java enhancement scope for /C [id: 0] [Java(Source)]: private open field y: R|kotlin/Int| from Java enhancement scope for /C [id: 0]
D: D:
[Java]: public open field x: R|kotlin/Int| from Java enhancement scope for /D [id: 0] [Java(Source)]: public open field x: R|kotlin/Int| from Java enhancement scope for /D [id: 0]
[IntersectionOverride]: public abstract val x: R|kotlin/Int| from Java enhancement scope for /D [id: 0] [IntersectionOverride]: public abstract val x: R|kotlin/Int| from Java enhancement scope for /D [id: 0]
[Source]: public abstract val x: R|kotlin/Int| from Use site scope of /A [id: 1] [Source]: public abstract val x: R|kotlin/Int| from Use site scope of /A [id: 1]
[Source]: public abstract val x: R|kotlin/String| from Use site scope of /B [id: 2] [Source]: public abstract val x: R|kotlin/String| from Use site scope of /B [id: 2]
[Java]: private open field y: R|kotlin/Int| from Java enhancement scope for /D [id: 0] [Java(Source)]: private open field y: R|kotlin/Int| from Java enhancement scope for /D [id: 0]
[Synthetic]: public abstract val y: R|kotlin/Int| from Java enhancement scope for /D [id: 0] [Synthetic]: public abstract val y: R|kotlin/Int| from Java enhancement scope for /D [id: 0]
[Source]: public abstract val y: R|kotlin/Int| from Use site scope of /A [id: 1] [Source]: public abstract val y: R|kotlin/Int| from Use site scope of /A [id: 1]
[Source]: public abstract val y: R|kotlin/Int| from Use site scope of /B [id: 2] [Source]: public abstract val y: R|kotlin/Int| from Use site scope of /B [id: 2]
@@ -39,7 +39,7 @@ object FirInterfaceDefaultMethodCallChecker : FirQualifiedAccessExpressionChecke
var typeSymbol: FirRegularClassSymbol? = null var typeSymbol: FirRegularClassSymbol? = null
if (!supportsDefaults && symbol.isStatic) { if (!supportsDefaults && symbol.isStatic) {
typeSymbol = getTypeSymbol() ?: return typeSymbol = getTypeSymbol() ?: return
if (typeSymbol.isInterface && typeSymbol.origin == FirDeclarationOrigin.Java) { if (typeSymbol.isInterface && typeSymbol.origin is FirDeclarationOrigin.Java) {
reporter.reportOn(expression.source, FirJvmErrors.INTERFACE_STATIC_METHOD_CALL_FROM_JAVA6_TARGET, context) reporter.reportOn(expression.source, FirJvmErrors.INTERFACE_STATIC_METHOD_CALL_FROM_JAVA6_TARGET, context)
} }
} }
@@ -55,7 +55,7 @@ object FirInterfaceDefaultMethodCallChecker : FirQualifiedAccessExpressionChecke
if (typeSymbol == null) typeSymbol = getTypeSymbol() ?: return if (typeSymbol == null) typeSymbol = getTypeSymbol() ?: return
val jvmDefaultMode = context.session.jvmDefaultModeState val jvmDefaultMode = context.session.jvmDefaultModeState
if (typeSymbol.isInterface && (typeSymbol.origin == FirDeclarationOrigin.Java || symbol.isCompiledToJvmDefault(jvmDefaultMode))) { if (typeSymbol.isInterface && (typeSymbol.origin is FirDeclarationOrigin.Java || symbol.isCompiledToJvmDefault(jvmDefaultMode))) {
if (containingDeclaration.isInterface) { if (containingDeclaration.isInterface) {
val containingMember = context.findContainingMember()?.symbol val containingMember = context.findContainingMember()?.symbol
if (containingMember?.isCompiledToJvmDefault(jvmDefaultMode) == false) { if (containingMember?.isCompiledToJvmDefault(jvmDefaultMode) == false) {
@@ -35,7 +35,7 @@ object FirJavaAnnotationsChecker : FirAnnotationChecker() {
override fun check(expression: FirAnnotation, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(expression: FirAnnotation, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.containingDeclarations.lastOrNull()?.source?.kind != KtRealSourceElementKind) return if (context.containingDeclarations.lastOrNull()?.source?.kind != KtRealSourceElementKind) return
val callableSymbol = expression.annotationTypeRef.toRegularClassSymbol(context.session) val callableSymbol = expression.annotationTypeRef.toRegularClassSymbol(context.session)
if (callableSymbol?.origin != FirDeclarationOrigin.Java) return if (callableSymbol?.origin !is FirDeclarationOrigin.Java) return
val lookupTag = expression.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return val lookupTag = expression.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return
javaToKotlinNameMap[lookupTag.classId]?.let { betterName -> javaToKotlinNameMap[lookupTag.classId]?.let { betterName ->
@@ -127,7 +127,7 @@ fun FirClassLikeSymbol<*>.containsRepeatableAnnotation(session: FirSession): Boo
getAnnotationByClassId(StandardClassIds.Annotations.JvmRepeatable) != null getAnnotationByClassId(StandardClassIds.Annotations.JvmRepeatable) != null
) { ) {
return session.languageVersionSettings.supportsFeature(LanguageFeature.RepeatableAnnotations) || return session.languageVersionSettings.supportsFeature(LanguageFeature.RepeatableAnnotations) ||
getAnnotationRetention() == AnnotationRetention.SOURCE && origin == FirDeclarationOrigin.Java getAnnotationRetention() == AnnotationRetention.SOURCE && origin is FirDeclarationOrigin.Java
} }
return false return false
} }
@@ -43,7 +43,7 @@ object FirSealedSupertypeChecker : FirClassChecker() {
val superClass = context.session.symbolProvider.getClassLikeSymbolByClassId(superClassId) as? FirRegularClassSymbol ?: continue val superClass = context.session.symbolProvider.getClassLikeSymbolByClassId(superClassId) as? FirRegularClassSymbol ?: continue
if (!superClass.isSealed) continue if (!superClass.isSealed) continue
if (superClass.origin == FirDeclarationOrigin.Java) { if (superClass.origin is FirDeclarationOrigin.Java) {
reporter.reportOn(superTypeRef.source, FirErrors.CLASS_INHERITS_JAVA_SEALED_CLASS, context) reporter.reportOn(superTypeRef.source, FirErrors.CLASS_INHERITS_JAVA_SEALED_CLASS, context)
continue continue
} }
@@ -171,7 +171,7 @@ class Fir2IrLazyClass(
// TODO we also come here for all deserialized / enhanced static enum members (with declaration.source == null). // TODO we also come here for all deserialized / enhanced static enum members (with declaration.source == null).
// For such members we currently can't tell whether they are compiler-generated methods or not. // For such members we currently can't tell whether they are compiler-generated methods or not.
// Note: we must drop declarations from Java here to avoid FirJavaTypeRefs inside // Note: we must drop declarations from Java here to avoid FirJavaTypeRefs inside
if (declaration.source == null && declaration.origin != FirDeclarationOrigin.Java || if (declaration.source == null && declaration.origin !is FirDeclarationOrigin.Java ||
declaration.source?.kind == KtFakeSourceElementKind.EnumGeneratedDeclaration declaration.source?.kind == KtFakeSourceElementKind.EnumGeneratedDeclaration
) { ) {
result += declarationStorage.getIrFunctionSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate).owner result += declarationStorage.getIrFunctionSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate).owner
@@ -109,7 +109,7 @@ abstract class FirJavaFacade(
): FirTypeParameter { ): FirTypeParameter {
return buildTypeParameter { return buildTypeParameter {
this.moduleData = moduleData this.moduleData = moduleData
origin = FirDeclarationOrigin.Java origin = javaOrigin(isFromSource)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
name = this@toFirTypeParameter.name name = this@toFirTypeParameter.name
symbol = FirTypeParameterSymbol() symbol = FirTypeParameterSymbol()
@@ -240,6 +240,7 @@ abstract class FirJavaFacade(
this.moduleData = moduleData this.moduleData = moduleData
symbol = classSymbol symbol = classSymbol
name = javaClass.name name = javaClass.name
isFromSource = javaClass.isFromSource
val visibility = javaClass.visibility val visibility = javaClass.visibility
this@buildJavaClass.visibility = visibility this@buildJavaClass.visibility = visibility
classKind = javaClass.classKind classKind = javaClass.classKind
@@ -356,7 +357,7 @@ abstract class FirJavaFacade(
if (classIsAnnotation) { if (classIsAnnotation) {
declarations += declarations +=
buildConstructorForAnnotationClass( buildConstructorForAnnotationClass(
classSource = (javaClass as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) as? KtFakeSourceElement, javaClass,
constructorId = constructorId, constructorId = constructorId,
ownerClassBuilder = this, ownerClassBuilder = this,
valueParametersForAnnotationConstructor = valueParametersForAnnotationConstructor, valueParametersForAnnotationConstructor = valueParametersForAnnotationConstructor,
@@ -412,7 +413,7 @@ abstract class FirJavaFacade(
} }
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack) returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Java origin = javaOrigin(javaField.isFromSource)
// TODO: check if this works properly with annotations that take the enum class as an argument // TODO: check if this works properly with annotations that take the enum class as an argument
annotations.addFromJava(session, javaField, javaTypeParameterStack) annotations.addFromJava(session, javaField, javaTypeParameterStack)
}.apply { }.apply {
@@ -423,6 +424,7 @@ abstract class FirJavaFacade(
this.moduleData = moduleData this.moduleData = moduleData
symbol = FirFieldSymbol(fieldId) symbol = FirFieldSymbol(fieldId)
name = fieldName name = fieldName
isFromSource = javaField.isFromSource
status = FirResolvedDeclarationStatusImpl( status = FirResolvedDeclarationStatusImpl(
javaField.visibility, javaField.visibility,
javaField.modality, javaField.modality,
@@ -473,6 +475,7 @@ abstract class FirJavaFacade(
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement() source = (javaMethod as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
symbol = methodSymbol symbol = methodSymbol
name = methodName name = methodName
isFromSource = javaMethod.isFromSource
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack) returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
isStatic = javaMethod.isStatic isStatic = javaMethod.isStatic
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol, moduleData) typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol, moduleData)
@@ -518,6 +521,7 @@ abstract class FirJavaFacade(
source = (javaMethod as? JavaElementImpl<*>)?.psi source = (javaMethod as? JavaElementImpl<*>)?.psi
?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitJavaAnnotationConstructor) ?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
this.moduleData = moduleData this.moduleData = moduleData
isFromSource = javaMethod.isFromSource
returnTypeRef = firJavaMethod.returnTypeRef returnTypeRef = firJavaMethod.returnTypeRef
name = javaMethod.name name = javaMethod.name
isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME
@@ -538,6 +542,7 @@ abstract class FirJavaFacade(
return buildJavaConstructor { return buildJavaConstructor {
source = (javaConstructor as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement() source = (javaConstructor as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
this.moduleData = moduleData this.moduleData = moduleData
isFromSource = javaClass.isFromSource
symbol = constructorSymbol symbol = constructorSymbol
isInner = javaClass.outerClass != null && !javaClass.isStatic isInner = javaClass.outerClass != null && !javaClass.isStatic
val isThisInner = this.isInner val isThisInner = this.isInner
@@ -575,15 +580,18 @@ abstract class FirJavaFacade(
} }
private fun buildConstructorForAnnotationClass( private fun buildConstructorForAnnotationClass(
classSource: KtFakeSourceElement?, javaClass: JavaClass,
constructorId: CallableId, constructorId: CallableId,
ownerClassBuilder: FirJavaClassBuilder, ownerClassBuilder: FirJavaClassBuilder,
valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor, valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor,
moduleData: FirModuleData, moduleData: FirModuleData,
): FirJavaConstructor { ): FirJavaConstructor {
return buildJavaConstructor { return buildJavaConstructor {
source = classSource source = (javaClass as? JavaElementImpl<*>)
?.psi
?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) as? KtFakeSourceElement
this.moduleData = moduleData this.moduleData = moduleData
isFromSource = javaClass.isFromSource
symbol = FirConstructorSymbol(constructorId) symbol = FirConstructorSymbol(constructorId)
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public) status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
returnTypeRef = buildResolvedTypeRef { returnTypeRef = buildResolvedTypeRef {
@@ -29,13 +29,13 @@ import org.jetbrains.kotlin.load.java.structure.JavaPackage
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import kotlin.properties.Delegates import kotlin.properties.Delegates
@OptIn(FirImplementationDetail::class)
class FirJavaClass @FirImplementationDetail internal constructor( class FirJavaClass @FirImplementationDetail internal constructor(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override val moduleData: FirModuleData, override val moduleData: FirModuleData,
@Volatile @Volatile
override var resolvePhase: FirResolvePhase, override var resolvePhase: FirResolvePhase,
override val name: Name, override val name: Name,
override val origin: FirDeclarationOrigin.Java,
override val annotations: MutableList<FirAnnotation>, override val annotations: MutableList<FirAnnotation>,
override var status: FirDeclarationStatus, override var status: FirDeclarationStatus,
override val classKind: ClassKind, override val classKind: ClassKind,
@@ -59,9 +59,6 @@ class FirJavaClass @FirImplementationDetail internal constructor(
symbol.bind(this) symbol.bind(this)
} }
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
override val attributes: FirDeclarationAttributes = FirDeclarationAttributes() override val attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) { override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) {
@@ -131,6 +128,7 @@ class FirJavaClass @FirImplementationDetail internal constructor(
internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationContainerBuilder { internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationContainerBuilder {
lateinit var visibility: Visibility lateinit var visibility: Visibility
var modality: Modality? = null var modality: Modality? = null
var isFromSource: Boolean by Delegates.notNull()
var isTopLevel: Boolean by Delegates.notNull() var isTopLevel: Boolean by Delegates.notNull()
var isStatic: Boolean by Delegates.notNull() var isStatic: Boolean by Delegates.notNull()
var isNotSam: Boolean by Delegates.notNull() var isNotSam: Boolean by Delegates.notNull()
@@ -153,6 +151,7 @@ internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationCont
moduleData, moduleData,
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES, resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
name, name,
origin = javaOrigin(isFromSource),
annotations, annotations,
status, status,
classKind, classKind,
@@ -31,6 +31,7 @@ class FirJavaConstructor @FirImplementationDetail constructor(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override val moduleData: FirModuleData, override val moduleData: FirModuleData,
override val symbol: FirConstructorSymbol, override val symbol: FirConstructorSymbol,
override val origin: FirDeclarationOrigin.Java,
override val isPrimary: Boolean, override val isPrimary: Boolean,
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override val valueParameters: MutableList<FirValueParameter>, override val valueParameters: MutableList<FirValueParameter>,
@@ -54,9 +55,6 @@ class FirJavaConstructor @FirImplementationDetail constructor(
override val body: FirBlock? override val body: FirBlock?
get() = null get() = null
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
override val attributes: FirDeclarationAttributes = FirDeclarationAttributes() override val attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
@@ -156,6 +154,7 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
lateinit var visibility: Visibility lateinit var visibility: Visibility
var isInner: Boolean by Delegates.notNull() var isInner: Boolean by Delegates.notNull()
var isPrimary: Boolean by Delegates.notNull() var isPrimary: Boolean by Delegates.notNull()
var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation> lateinit var annotationBuilder: () -> List<FirAnnotation>
@OptIn(FirImplementationDetail::class) @OptIn(FirImplementationDetail::class)
@@ -164,6 +163,7 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
source, source,
moduleData, moduleData,
symbol, symbol,
origin = javaOrigin(isFromSource),
isPrimary, isPrimary,
returnTypeRef, returnTypeRef,
valueParameters, valueParameters,
@@ -31,10 +31,10 @@ import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.properties.Delegates import kotlin.properties.Delegates
@OptIn(FirImplementationDetail::class)
class FirJavaField @FirImplementationDetail constructor( class FirJavaField @FirImplementationDetail constructor(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override val moduleData: FirModuleData, override val moduleData: FirModuleData,
override val origin: FirDeclarationOrigin.Java,
override val symbol: FirFieldSymbol, override val symbol: FirFieldSymbol,
override val name: Name, override val name: Name,
@Volatile @Volatile
@@ -58,8 +58,6 @@ class FirJavaField @FirImplementationDetail constructor(
override val setter: FirPropertyAccessor? get() = null override val setter: FirPropertyAccessor? get() = null
override val backingField: FirBackingField? = null override val backingField: FirBackingField? = null
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() } override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
@@ -170,6 +168,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
var modality: Modality? = null var modality: Modality? = null
lateinit var visibility: Visibility lateinit var visibility: Visibility
var isStatic: Boolean by Delegates.notNull() var isStatic: Boolean by Delegates.notNull()
var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation> lateinit var annotationBuilder: () -> List<FirAnnotation>
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@@ -179,6 +178,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
return FirJavaField( return FirJavaField(
source, source,
moduleData, moduleData,
origin = javaOrigin(isFromSource),
symbol, symbol,
name, name,
resolvePhase, resolvePhase,
@@ -46,10 +46,10 @@ import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.properties.Delegates import kotlin.properties.Delegates
@OptIn(FirImplementationDetail::class)
class FirJavaMethod @FirImplementationDetail constructor( class FirJavaMethod @FirImplementationDetail constructor(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override val moduleData: FirModuleData, override val moduleData: FirModuleData,
override val origin: FirDeclarationOrigin.Java,
@Volatile @Volatile
override var resolvePhase: FirResolvePhase, override var resolvePhase: FirResolvePhase,
override val attributes: FirDeclarationAttributes, override val attributes: FirDeclarationAttributes,
@@ -75,9 +75,6 @@ class FirJavaMethod @FirImplementationDetail constructor(
override val containerSource: DeserializedContainerSource? override val containerSource: DeserializedContainerSource?
get() = null get() = null
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
override val contractDescription: FirContractDescription override val contractDescription: FirContractDescription
get() = FirEmptyContractDescription get() = FirEmptyContractDescription
@@ -207,6 +204,7 @@ class FirJavaMethodBuilder : FirFunctionBuilder, FirTypeParametersOwnerBuilder,
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf() override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
var isStatic: Boolean by Delegates.notNull() var isStatic: Boolean by Delegates.notNull()
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation> lateinit var annotationBuilder: () -> List<FirAnnotation>
@Deprecated("Modification of 'deprecation' has no impact for FirJavaFunctionBuilder", level = DeprecationLevel.HIDDEN) @Deprecated("Modification of 'deprecation' has no impact for FirJavaFunctionBuilder", level = DeprecationLevel.HIDDEN)
@@ -239,6 +237,7 @@ class FirJavaMethodBuilder : FirFunctionBuilder, FirTypeParametersOwnerBuilder,
return FirJavaMethod( return FirJavaMethod(
source, source,
moduleData, moduleData,
origin = javaOrigin(isFromSource),
resolvePhase, resolvePhase,
attributes, attributes,
returnTypeRef as FirJavaTypeRef, returnTypeRef as FirJavaTypeRef,
@@ -274,6 +273,7 @@ inline fun buildJavaMethodCopy(original: FirSimpleFunction, init: FirJavaMethodB
copyBuilder.dispatchReceiverType = original.dispatchReceiverType copyBuilder.dispatchReceiverType = original.dispatchReceiverType
copyBuilder.name = original.name copyBuilder.name = original.name
copyBuilder.symbol = original.symbol copyBuilder.symbol = original.symbol
copyBuilder.isFromSource = original.origin.fromSource
copyBuilder.annotations.addAll(original.annotations) copyBuilder.annotations.addAll(original.annotations)
copyBuilder.typeParameters.addAll(original.typeParameters) copyBuilder.typeParameters.addAll(original.typeParameters)
val annotations = original.annotations val annotations = original.annotations
@@ -25,11 +25,13 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.properties.Delegates
@OptIn(FirImplementationDetail::class) @OptIn(FirImplementationDetail::class)
class FirJavaValueParameter @FirImplementationDetail constructor( class FirJavaValueParameter @FirImplementationDetail constructor(
override val source: KtSourceElement?, override val source: KtSourceElement?,
override val moduleData: FirModuleData, override val moduleData: FirModuleData,
override val origin: FirDeclarationOrigin.Java,
@Volatile @Volatile
override var resolvePhase: FirResolvePhase, override var resolvePhase: FirResolvePhase,
override val attributes: FirDeclarationAttributes, override val attributes: FirDeclarationAttributes,
@@ -58,9 +60,6 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() } override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
override val origin: FirDeclarationOrigin
get() = FirDeclarationOrigin.Java
override val receiverTypeRef: FirTypeRef? override val receiverTypeRef: FirTypeRef?
get() = null get() = null
@@ -199,13 +198,15 @@ class FirJavaValueParameterBuilder {
lateinit var name: Name lateinit var name: Name
lateinit var annotationBuilder: () -> List<FirAnnotation> lateinit var annotationBuilder: () -> List<FirAnnotation>
var defaultValue: FirExpression? = null var defaultValue: FirExpression? = null
var isVararg: Boolean by kotlin.properties.Delegates.notNull() var isVararg: Boolean by Delegates.notNull()
var isFromSource: Boolean by Delegates.notNull()
@OptIn(FirImplementationDetail::class) @OptIn(FirImplementationDetail::class)
fun build(): FirJavaValueParameter { fun build(): FirJavaValueParameter {
return FirJavaValueParameter( return FirJavaValueParameter(
source, source,
moduleData, moduleData,
origin = javaOrigin(isFromSource),
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES, resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
attributes, attributes,
returnTypeRef, returnTypeRef,
@@ -231,6 +232,7 @@ inline fun buildJavaValueParameterCopy(original: FirValueParameter, init: FirJav
copyBuilder.source = original.source copyBuilder.source = original.source
copyBuilder.moduleData = original.moduleData copyBuilder.moduleData = original.moduleData
copyBuilder.attributes = original.attributes.copy() copyBuilder.attributes = original.attributes.copy()
copyBuilder.isFromSource = original.origin.fromSource
copyBuilder.returnTypeRef = original.returnTypeRef copyBuilder.returnTypeRef = original.returnTypeRef
copyBuilder.name = original.name copyBuilder.name = original.name
val annotations = original.annotations val annotations = original.annotations
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.java.declarations
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
internal fun javaOrigin(isFromSource: Boolean): FirDeclarationOrigin.Java {
return if (isFromSource) FirDeclarationOrigin.Java.Source else FirDeclarationOrigin.Java.Library
}
@@ -127,6 +127,7 @@ class FirSignatureEnhancement(
this.symbol = symbol this.symbol = symbol
this.name = name this.name = name
returnTypeRef = newReturnTypeRef returnTypeRef = newReturnTypeRef
isFromSource = original.origin.fromSource
// TODO: Use some kind of copy mechanism // TODO: Use some kind of copy mechanism
visibility = firElement.visibility visibility = firElement.visibility
@@ -550,7 +551,7 @@ private class EnhancementSignatureParts(
override fun KotlinTypeMarker.isArrayOrPrimitiveArray(): Boolean = (this as ConeKotlinType).isArrayOrPrimitiveArray override fun KotlinTypeMarker.isArrayOrPrimitiveArray(): Boolean = (this as ConeKotlinType).isArrayOrPrimitiveArray
override val TypeParameterMarker.isFromJava: Boolean override val TypeParameterMarker.isFromJava: Boolean
get() = (this as ConeTypeParameterLookupTag).symbol.fir.origin == FirDeclarationOrigin.Java get() = (this as ConeTypeParameterLookupTag).symbol.fir.origin is FirDeclarationOrigin.Java
} }
class FirEnhancedSymbolsStorage(val session: FirSession) : FirSessionComponent { class FirEnhancedSymbolsStorage(val session: FirSession) : FirSessionComponent {
@@ -56,6 +56,7 @@ internal fun JavaValueParameter.toFirValueParameter(
): FirValueParameter { ): FirValueParameter {
return buildJavaValueParameter { return buildJavaValueParameter {
source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement() source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
isFromSource = this@toFirValueParameter.isFromSource
this.moduleData = moduleData this.moduleData = moduleData
name = this@toFirValueParameter.name ?: Name.identifier("p$index") name = this@toFirValueParameter.name ?: Name.identifier("p$index")
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack) returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
@@ -510,7 +510,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(session: FirSession): Forbidd
// (org.jetbrains.kotlin.resolve.OverridingUtil#selectMostSpecificMember), from which the `hasStableParameterNames` status is // (org.jetbrains.kotlin.resolve.OverridingUtil#selectMostSpecificMember), from which the `hasStableParameterNames` status is
// copied. // copied.
FirDeclarationOrigin.IntersectionOverride -> originalForIntersectionOverrideAttr?.getAsForbiddenNamedArgumentsTarget(session) FirDeclarationOrigin.IntersectionOverride -> originalForIntersectionOverrideAttr?.getAsForbiddenNamedArgumentsTarget(session)
FirDeclarationOrigin.Java, FirDeclarationOrigin.Enhancement -> ForbiddenNamedArgumentsTarget.NON_KOTLIN_FUNCTION is FirDeclarationOrigin.Java, FirDeclarationOrigin.Enhancement -> ForbiddenNamedArgumentsTarget.NON_KOTLIN_FUNCTION
FirDeclarationOrigin.SamConstructor -> null FirDeclarationOrigin.SamConstructor -> null
FirDeclarationOrigin.SubstitutionOverride -> originalForSubstitutionOverrideAttr?.getAsForbiddenNamedArgumentsTarget(session) FirDeclarationOrigin.SubstitutionOverride -> originalForSubstitutionOverrideAttr?.getAsForbiddenNamedArgumentsTarget(session)
// referenced function of a Kotlin function type // referenced function of a Kotlin function type
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.toSymbol import org.jetbrains.kotlin.fir.types.toSymbol
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
@OptIn(AdapterForResolveProcessor::class)
class FirStatusResolveProcessor( class FirStatusResolveProcessor(
session: FirSession, session: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
@@ -392,9 +391,8 @@ abstract class AbstractFirStatusResolveTransformer(
} }
} }
@OptIn(ExperimentalStdlibApi::class)
private fun forceResolveStatusesOfClass(regularClass: FirRegularClass) { private fun forceResolveStatusesOfClass(regularClass: FirRegularClass) {
if (regularClass.origin == FirDeclarationOrigin.Java || regularClass.origin == FirDeclarationOrigin.Precompiled) { if (regularClass.origin is FirDeclarationOrigin.Java || regularClass.origin == FirDeclarationOrigin.Precompiled) {
/* /*
* If regular class has no corresponding file then it is platform class, * If regular class has no corresponding file then it is platform class,
* so we need to resolve supertypes of this class because they could * so we need to resolve supertypes of this class because they could
@@ -5,12 +5,21 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
sealed class FirDeclarationOrigin(private val displayName: String? = null, val fromSupertypes: Boolean = false, val generated: Boolean = false) { sealed class FirDeclarationOrigin(
object Source : FirDeclarationOrigin() private val displayName: String? = null,
val fromSupertypes: Boolean = false,
val generated: Boolean = false,
val fromSource: Boolean = false
) {
object Source : FirDeclarationOrigin(fromSource = true)
object Library : FirDeclarationOrigin() object Library : FirDeclarationOrigin()
object Precompiled : FirDeclarationOrigin() // currently used for incremental compilation object Precompiled : FirDeclarationOrigin() // currently used for incremental compilation
object BuiltIns : FirDeclarationOrigin() object BuiltIns : FirDeclarationOrigin()
object Java : FirDeclarationOrigin() sealed class Java(displayName: String, fromSource: Boolean = false) : FirDeclarationOrigin(displayName, fromSource = fromSource) {
object Source : Java("Java(Source)", fromSource = true)
object Library : Java("Java(Library)")
}
object Synthetic : FirDeclarationOrigin() object Synthetic : FirDeclarationOrigin()
object DynamicScope : FirDeclarationOrigin() object DynamicScope : FirDeclarationOrigin()
object SamConstructor : FirDeclarationOrigin() object SamConstructor : FirDeclarationOrigin()
@@ -47,16 +47,18 @@ val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol?
} }
inline val FirDeclaration.isJava: Boolean inline val FirDeclaration.isJava: Boolean
get() = origin == FirDeclarationOrigin.Java get() = origin is FirDeclarationOrigin.Java
inline val FirDeclaration.isJavaSource: Boolean
get() = origin == FirDeclarationOrigin.Java.Source
inline val FirDeclaration.isFromLibrary: Boolean inline val FirDeclaration.isFromLibrary: Boolean
get() = origin == FirDeclarationOrigin.Library get() = origin == FirDeclarationOrigin.Library || origin == FirDeclarationOrigin.Java.Library
inline val FirDeclaration.isPrecompiled: Boolean inline val FirDeclaration.isPrecompiled: Boolean
get() = origin == FirDeclarationOrigin.Precompiled get() = origin == FirDeclarationOrigin.Precompiled
inline val FirDeclaration.isSynthetic: Boolean inline val FirDeclaration.isSynthetic: Boolean
get() = origin == FirDeclarationOrigin.Synthetic get() = origin == FirDeclarationOrigin.Synthetic
inline val FirDeclaration.isJavaOrEnhancement: Boolean inline val FirDeclaration.isJavaOrEnhancement: Boolean
get() = origin == FirDeclarationOrigin.Java || origin == FirDeclarationOrigin.Enhancement get() = origin is FirDeclarationOrigin.Java || origin == FirDeclarationOrigin.Enhancement
inline val FirBasedSymbol<*>.isJavaOrEnhancement: Boolean inline val FirBasedSymbol<*>.isJavaOrEnhancement: Boolean
get() = origin == FirDeclarationOrigin.Java || origin == FirDeclarationOrigin.Enhancement get() = origin is FirDeclarationOrigin.Java || origin == FirDeclarationOrigin.Enhancement