[FIR] Add two kinds of Java origin to distinguish source and library declarations
This commit is contained in:
committed by
teamcity
parent
26df9d74e8
commit
fb57e1ecd5
@@ -109,7 +109,7 @@ abstract class FirJavaFacade(
|
||||
): FirTypeParameter {
|
||||
return buildTypeParameter {
|
||||
this.moduleData = moduleData
|
||||
origin = FirDeclarationOrigin.Java
|
||||
origin = javaOrigin(isFromSource)
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
name = this@toFirTypeParameter.name
|
||||
symbol = FirTypeParameterSymbol()
|
||||
@@ -240,6 +240,7 @@ abstract class FirJavaFacade(
|
||||
this.moduleData = moduleData
|
||||
symbol = classSymbol
|
||||
name = javaClass.name
|
||||
isFromSource = javaClass.isFromSource
|
||||
val visibility = javaClass.visibility
|
||||
this@buildJavaClass.visibility = visibility
|
||||
classKind = javaClass.classKind
|
||||
@@ -356,7 +357,7 @@ abstract class FirJavaFacade(
|
||||
if (classIsAnnotation) {
|
||||
declarations +=
|
||||
buildConstructorForAnnotationClass(
|
||||
classSource = (javaClass as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) as? KtFakeSourceElement,
|
||||
javaClass,
|
||||
constructorId = constructorId,
|
||||
ownerClassBuilder = this,
|
||||
valueParametersForAnnotationConstructor = valueParametersForAnnotationConstructor,
|
||||
@@ -412,7 +413,7 @@ abstract class FirJavaFacade(
|
||||
}
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||
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
|
||||
annotations.addFromJava(session, javaField, javaTypeParameterStack)
|
||||
}.apply {
|
||||
@@ -423,6 +424,7 @@ abstract class FirJavaFacade(
|
||||
this.moduleData = moduleData
|
||||
symbol = FirFieldSymbol(fieldId)
|
||||
name = fieldName
|
||||
isFromSource = javaField.isFromSource
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaField.visibility,
|
||||
javaField.modality,
|
||||
@@ -473,6 +475,7 @@ abstract class FirJavaFacade(
|
||||
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
|
||||
symbol = methodSymbol
|
||||
name = methodName
|
||||
isFromSource = javaMethod.isFromSource
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||
isStatic = javaMethod.isStatic
|
||||
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol, moduleData)
|
||||
@@ -518,6 +521,7 @@ abstract class FirJavaFacade(
|
||||
source = (javaMethod as? JavaElementImpl<*>)?.psi
|
||||
?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
|
||||
this.moduleData = moduleData
|
||||
isFromSource = javaMethod.isFromSource
|
||||
returnTypeRef = firJavaMethod.returnTypeRef
|
||||
name = javaMethod.name
|
||||
isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME
|
||||
@@ -538,6 +542,7 @@ abstract class FirJavaFacade(
|
||||
return buildJavaConstructor {
|
||||
source = (javaConstructor as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
|
||||
this.moduleData = moduleData
|
||||
isFromSource = javaClass.isFromSource
|
||||
symbol = constructorSymbol
|
||||
isInner = javaClass.outerClass != null && !javaClass.isStatic
|
||||
val isThisInner = this.isInner
|
||||
@@ -575,15 +580,18 @@ abstract class FirJavaFacade(
|
||||
}
|
||||
|
||||
private fun buildConstructorForAnnotationClass(
|
||||
classSource: KtFakeSourceElement?,
|
||||
javaClass: JavaClass,
|
||||
constructorId: CallableId,
|
||||
ownerClassBuilder: FirJavaClassBuilder,
|
||||
valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor,
|
||||
moduleData: FirModuleData,
|
||||
): FirJavaConstructor {
|
||||
return buildJavaConstructor {
|
||||
source = classSource
|
||||
source = (javaClass as? JavaElementImpl<*>)
|
||||
?.psi
|
||||
?.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) as? KtFakeSourceElement
|
||||
this.moduleData = moduleData
|
||||
isFromSource = javaClass.isFromSource
|
||||
symbol = FirConstructorSymbol(constructorId)
|
||||
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
|
||||
@@ -29,13 +29,13 @@ import org.jetbrains.kotlin.load.java.structure.JavaPackage
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
class FirJavaClass @FirImplementationDetail internal constructor(
|
||||
override val source: KtSourceElement?,
|
||||
override val moduleData: FirModuleData,
|
||||
@Volatile
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val name: Name,
|
||||
override val origin: FirDeclarationOrigin.Java,
|
||||
override val annotations: MutableList<FirAnnotation>,
|
||||
override var status: FirDeclarationStatus,
|
||||
override val classKind: ClassKind,
|
||||
@@ -59,9 +59,6 @@ class FirJavaClass @FirImplementationDetail internal constructor(
|
||||
symbol.bind(this)
|
||||
}
|
||||
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val attributes: FirDeclarationAttributes = FirDeclarationAttributes()
|
||||
|
||||
override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) {
|
||||
@@ -131,6 +128,7 @@ class FirJavaClass @FirImplementationDetail internal constructor(
|
||||
internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationContainerBuilder {
|
||||
lateinit var visibility: Visibility
|
||||
var modality: Modality? = null
|
||||
var isFromSource: Boolean by Delegates.notNull()
|
||||
var isTopLevel: Boolean by Delegates.notNull()
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
var isNotSam: Boolean by Delegates.notNull()
|
||||
@@ -153,6 +151,7 @@ internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationCont
|
||||
moduleData,
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
|
||||
name,
|
||||
origin = javaOrigin(isFromSource),
|
||||
annotations,
|
||||
status,
|
||||
classKind,
|
||||
|
||||
+3
-3
@@ -31,6 +31,7 @@ class FirJavaConstructor @FirImplementationDetail constructor(
|
||||
override val source: KtSourceElement?,
|
||||
override val moduleData: FirModuleData,
|
||||
override val symbol: FirConstructorSymbol,
|
||||
override val origin: FirDeclarationOrigin.Java,
|
||||
override val isPrimary: Boolean,
|
||||
override var returnTypeRef: FirTypeRef,
|
||||
override val valueParameters: MutableList<FirValueParameter>,
|
||||
@@ -54,9 +55,6 @@ class FirJavaConstructor @FirImplementationDetail constructor(
|
||||
override val body: FirBlock?
|
||||
get() = null
|
||||
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val attributes: FirDeclarationAttributes = FirDeclarationAttributes()
|
||||
|
||||
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
|
||||
@@ -156,6 +154,7 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
|
||||
lateinit var visibility: Visibility
|
||||
var isInner: Boolean by Delegates.notNull()
|
||||
var isPrimary: Boolean by Delegates.notNull()
|
||||
var isFromSource: Boolean by Delegates.notNull()
|
||||
lateinit var annotationBuilder: () -> List<FirAnnotation>
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
@@ -164,6 +163,7 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
|
||||
source,
|
||||
moduleData,
|
||||
symbol,
|
||||
origin = javaOrigin(isFromSource),
|
||||
isPrimary,
|
||||
returnTypeRef,
|
||||
valueParameters,
|
||||
|
||||
@@ -31,10 +31,10 @@ import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
class FirJavaField @FirImplementationDetail constructor(
|
||||
override val source: KtSourceElement?,
|
||||
override val moduleData: FirModuleData,
|
||||
override val origin: FirDeclarationOrigin.Java,
|
||||
override val symbol: FirFieldSymbol,
|
||||
override val name: Name,
|
||||
@Volatile
|
||||
@@ -58,8 +58,6 @@ class FirJavaField @FirImplementationDetail constructor(
|
||||
override val setter: FirPropertyAccessor? get() = null
|
||||
override val backingField: FirBackingField? = null
|
||||
override val controlFlowGraphReference: FirControlFlowGraphReference? get() = null
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
|
||||
|
||||
@@ -170,6 +168,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
||||
var modality: Modality? = null
|
||||
lateinit var visibility: Visibility
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
var isFromSource: Boolean by Delegates.notNull()
|
||||
lateinit var annotationBuilder: () -> List<FirAnnotation>
|
||||
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
@@ -179,6 +178,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
||||
return FirJavaField(
|
||||
source,
|
||||
moduleData,
|
||||
origin = javaOrigin(isFromSource),
|
||||
symbol,
|
||||
name,
|
||||
resolvePhase,
|
||||
|
||||
@@ -46,10 +46,10 @@ import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
class FirJavaMethod @FirImplementationDetail constructor(
|
||||
override val source: KtSourceElement?,
|
||||
override val moduleData: FirModuleData,
|
||||
override val origin: FirDeclarationOrigin.Java,
|
||||
@Volatile
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val attributes: FirDeclarationAttributes,
|
||||
@@ -75,9 +75,6 @@ class FirJavaMethod @FirImplementationDetail constructor(
|
||||
override val containerSource: DeserializedContainerSource?
|
||||
get() = null
|
||||
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val contractDescription: FirContractDescription
|
||||
get() = FirEmptyContractDescription
|
||||
|
||||
@@ -207,6 +204,7 @@ class FirJavaMethodBuilder : FirFunctionBuilder, FirTypeParametersOwnerBuilder,
|
||||
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
var isFromSource: Boolean by Delegates.notNull()
|
||||
lateinit var annotationBuilder: () -> List<FirAnnotation>
|
||||
|
||||
@Deprecated("Modification of 'deprecation' has no impact for FirJavaFunctionBuilder", level = DeprecationLevel.HIDDEN)
|
||||
@@ -239,6 +237,7 @@ class FirJavaMethodBuilder : FirFunctionBuilder, FirTypeParametersOwnerBuilder,
|
||||
return FirJavaMethod(
|
||||
source,
|
||||
moduleData,
|
||||
origin = javaOrigin(isFromSource),
|
||||
resolvePhase,
|
||||
attributes,
|
||||
returnTypeRef as FirJavaTypeRef,
|
||||
@@ -274,6 +273,7 @@ inline fun buildJavaMethodCopy(original: FirSimpleFunction, init: FirJavaMethodB
|
||||
copyBuilder.dispatchReceiverType = original.dispatchReceiverType
|
||||
copyBuilder.name = original.name
|
||||
copyBuilder.symbol = original.symbol
|
||||
copyBuilder.isFromSource = original.origin.fromSource
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.typeParameters.addAll(original.typeParameters)
|
||||
val annotations = original.annotations
|
||||
|
||||
+6
-4
@@ -25,11 +25,13 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
@OptIn(FirImplementationDetail::class)
|
||||
class FirJavaValueParameter @FirImplementationDetail constructor(
|
||||
override val source: KtSourceElement?,
|
||||
override val moduleData: FirModuleData,
|
||||
override val origin: FirDeclarationOrigin.Java,
|
||||
@Volatile
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val attributes: FirDeclarationAttributes,
|
||||
@@ -58,9 +60,6 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
|
||||
|
||||
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
|
||||
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val receiverTypeRef: FirTypeRef?
|
||||
get() = null
|
||||
|
||||
@@ -199,13 +198,15 @@ class FirJavaValueParameterBuilder {
|
||||
lateinit var name: Name
|
||||
lateinit var annotationBuilder: () -> List<FirAnnotation>
|
||||
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)
|
||||
fun build(): FirJavaValueParameter {
|
||||
return FirJavaValueParameter(
|
||||
source,
|
||||
moduleData,
|
||||
origin = javaOrigin(isFromSource),
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
|
||||
attributes,
|
||||
returnTypeRef,
|
||||
@@ -231,6 +232,7 @@ inline fun buildJavaValueParameterCopy(original: FirValueParameter, init: FirJav
|
||||
copyBuilder.source = original.source
|
||||
copyBuilder.moduleData = original.moduleData
|
||||
copyBuilder.attributes = original.attributes.copy()
|
||||
copyBuilder.isFromSource = original.origin.fromSource
|
||||
copyBuilder.returnTypeRef = original.returnTypeRef
|
||||
copyBuilder.name = original.name
|
||||
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
|
||||
}
|
||||
+2
-1
@@ -127,6 +127,7 @@ class FirSignatureEnhancement(
|
||||
this.symbol = symbol
|
||||
this.name = name
|
||||
returnTypeRef = newReturnTypeRef
|
||||
isFromSource = original.origin.fromSource
|
||||
|
||||
// TODO: Use some kind of copy mechanism
|
||||
visibility = firElement.visibility
|
||||
@@ -550,7 +551,7 @@ private class EnhancementSignatureParts(
|
||||
override fun KotlinTypeMarker.isArrayOrPrimitiveArray(): Boolean = (this as ConeKotlinType).isArrayOrPrimitiveArray
|
||||
|
||||
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 {
|
||||
|
||||
@@ -56,6 +56,7 @@ internal fun JavaValueParameter.toFirValueParameter(
|
||||
): FirValueParameter {
|
||||
return buildJavaValueParameter {
|
||||
source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
|
||||
isFromSource = this@toFirValueParameter.isFromSource
|
||||
this.moduleData = moduleData
|
||||
name = this@toFirValueParameter.name ?: Name.identifier("p$index")
|
||||
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||
|
||||
Reference in New Issue
Block a user