[Analysis API] create declarations from a library with library origin in StubBasedFirDeserializedSymbolProvider

This commit is contained in:
Ilya Kirillov
2023-10-05 16:04:10 +02:00
committed by Space Team
parent a3b67594ff
commit 64f90f685d
3 changed files with 28 additions and 25 deletions
@@ -148,7 +148,7 @@ KtFunctionSymbol:
isSuspend: false isSuspend: false
modality: FINAL modality: FINAL
name: copy name: copy
origin: SOURCE_MEMBER_GENERATED origin: LIBRARY
receiverParameter: null receiverParameter: null
returnType: KtUsualClassType: returnType: KtUsualClassType:
annotationsList: [] annotationsList: []
@@ -176,7 +176,7 @@ KtFunctionSymbol:
isNoinline: false isNoinline: false
isVararg: false isVararg: false
name: first name: first
origin: SOURCE_MEMBER_GENERATED origin: LIBRARY
receiverParameter: null receiverParameter: null
returnType: KtTypeParameterType: returnType: KtTypeParameterType:
annotationsList: [] annotationsList: []
@@ -195,7 +195,7 @@ KtFunctionSymbol:
isNoinline: false isNoinline: false
isVararg: false isVararg: false
name: second name: second
origin: SOURCE_MEMBER_GENERATED origin: LIBRARY
receiverParameter: null receiverParameter: null
returnType: KtTypeParameterType: returnType: KtTypeParameterType:
annotationsList: [] annotationsList: []
@@ -400,3 +400,4 @@ KtKotlinPropertySymbol:
symbolKind: CLASS_MEMBER symbolKind: CLASS_MEMBER
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
@@ -226,7 +226,7 @@ internal fun deserializeClassToSymbol(
classOrObject, classOrObject,
context.dispatchReceiver, context.dispatchReceiver,
zippedParameters, zippedParameters,
createResolvedStatus = true, isFromLibrary = true,
createClassTypeRefWithSourceKind = { firPrimaryConstructor.returnTypeRef.copyWithNewSourceKind(it) }, createClassTypeRefWithSourceKind = { firPrimaryConstructor.returnTypeRef.copyWithNewSourceKind(it) },
createParameterTypeRefWithSourceKind = { property, newKind -> createParameterTypeRefWithSourceKind = { property, newKind ->
property.returnTypeRef.copyWithNewSourceKind(newKind) property.returnTypeRef.copyWithNewSourceKind(newKind)
@@ -73,7 +73,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
name: Name, name: Name,
isExpect: Boolean, isExpect: Boolean,
forceLocalContext: Boolean = false, forceLocalContext: Boolean = false,
l: () -> T l: () -> T,
) = when { ) = when {
forceLocalContext -> withForcedLocalContext { forceLocalContext -> withForcedLocalContext {
withChildClassNameRegardlessLocalContext(name, isExpect, l) withChildClassNameRegardlessLocalContext(name, isExpect, l)
@@ -86,7 +86,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
inline fun <T> withChildClassNameRegardlessLocalContext( inline fun <T> withChildClassNameRegardlessLocalContext(
name: Name, name: Name,
isExpect: Boolean, isExpect: Boolean,
l: () -> T l: () -> T,
): T { ): T {
context.className = context.className.child(name) context.className = context.className.child(name)
val previousIsExpect = context.containerIsExpect val previousIsExpect = context.containerIsExpect
@@ -134,7 +134,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
status: Boolean, status: Boolean,
declarationSource: KtSourceElement? = null, declarationSource: KtSourceElement? = null,
currentFirTypeParameters: List<FirTypeParameterRef>, currentFirTypeParameters: List<FirTypeParameterRef>,
block: () -> T block: () -> T,
): T { ): T {
addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters) addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters)
return try { return try {
@@ -147,7 +147,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
protected open fun addCapturedTypeParameters( protected open fun addCapturedTypeParameters(
status: Boolean, status: Boolean,
declarationSource: KtSourceElement?, declarationSource: KtSourceElement?,
currentFirTypeParameters: List<FirTypeParameterRef> currentFirTypeParameters: List<FirTypeParameterRef>,
) { ) {
context.pushFirTypeParameters(status, currentFirTypeParameters) context.pushFirTypeParameters(status, currentFirTypeParameters)
} }
@@ -218,7 +218,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
fun FirExpression.toReturn( fun FirExpression.toReturn(
baseSource: KtSourceElement? = source, baseSource: KtSourceElement? = source,
labelName: String? = null, labelName: String? = null,
fromKtReturnExpression: Boolean = false fromKtReturnExpression: Boolean = false,
): FirReturnExpression { ): FirReturnExpression {
return buildReturnExpression { return buildReturnExpression {
fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) { fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
@@ -466,7 +466,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
protected fun ExceptionAttachmentBuilder.withSourceElementEntry(name: String, element: T?) { protected fun ExceptionAttachmentBuilder.withSourceElementEntry(name: String, element: T?) {
when (element) { when (element) {
is PsiElement -> withPsiEntry(name, element) is PsiElement -> withPsiEntry(name, element)
else -> withEntry(name, element) { it.asText} else -> withEntry(name, element) { it.asText }
} }
} }
@@ -474,7 +474,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
fun convertUnaryPlusMinusCallOnIntegerLiteralIfNecessary( fun convertUnaryPlusMinusCallOnIntegerLiteralIfNecessary(
source: T, source: T,
receiver: FirExpression, receiver: FirExpression,
operationToken: IElementType operationToken: IElementType,
): FirExpression? { ): FirExpression? {
if (receiver !is FirConstExpression<*>) return null if (receiver !is FirConstExpression<*>) return null
if (receiver.kind != ConstantValueKind.IntegerLiteral) return null if (receiver.kind != ConstantValueKind.IntegerLiteral) return null
@@ -498,7 +498,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
fun Array<out T?>.toInterpolatingCall( fun Array<out T?>.toInterpolatingCall(
base: T, base: T,
getElementType: (T) -> IElementType = { it.elementType }, getElementType: (T) -> IElementType = { it.elementType },
convertTemplateEntry: T?.(String) -> FirExpression convertTemplateEntry: T?.(String) -> FirExpression,
): FirExpression { ): FirExpression {
return buildStringConcatenationCall { return buildStringConcatenationCall {
val sb = StringBuilder() val sb = StringBuilder()
@@ -555,7 +555,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
receiver: T?, receiver: T?,
callName: Name, callName: Name,
prefix: Boolean, prefix: Boolean,
convert: T.() -> FirExpression convert: T.() -> FirExpression,
): FirExpression { ): FirExpression {
val unwrappedReceiver = receiver.unwrap() ?: return buildErrorExpression { val unwrappedReceiver = receiver.unwrap() ?: return buildErrorExpression {
diagnostic = ConeSyntaxDiagnostic("Inc/dec without operand") diagnostic = ConeSyntaxDiagnostic("Inc/dec without operand")
@@ -630,7 +630,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
receiver: T, receiver: T,
callName: Name, callName: Name,
prefix: Boolean, prefix: Boolean,
convert: T.() -> FirExpression convert: T.() -> FirExpression,
): FirExpression { ): FirExpression {
val array = receiver.arrayExpression val array = receiver.arrayExpression
return buildBlockPossiblyUnderSafeCall( return buildBlockPossiblyUnderSafeCall(
@@ -740,7 +740,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
receiver: T?, receiver: T?,
convert: T.() -> FirExpression, convert: T.() -> FirExpression,
sourceElementForError: KtSourceElement?, sourceElementForError: KtSourceElement?,
init: FirBlockBuilder.(receiver: FirExpression) -> Unit = {} init: FirBlockBuilder.(receiver: FirExpression) -> Unit = {},
): FirExpression { ): FirExpression {
val receiverFir = receiver?.convert() ?: buildErrorExpression { val receiverFir = receiver?.convert() ?: buildErrorExpression {
source = sourceElementForError source = sourceElementForError
@@ -779,7 +779,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
// since there should be different nodes for desugaring as `.set(.., get().plus($rhs1))` and `.get(...).plusAssign($rhs2)` // since there should be different nodes for desugaring as `.set(.., get().plus($rhs1))` and `.get(...).plusAssign($rhs2)`
// Once KT-50861 is fixed, those two parameters shall be eliminated // Once KT-50861 is fixed, those two parameters shall be eliminated
rhsAST: T?, rhsAST: T?,
convert: T.() -> FirExpression convert: T.() -> FirExpression,
): FirStatement { ): FirStatement {
val unwrappedLhs = this.unwrap() ?: return buildErrorExpression { val unwrappedLhs = this.unwrap() ?: return buildErrorExpression {
diagnostic = ConeSyntaxDiagnostic("Inc/dec without operand") diagnostic = ConeSyntaxDiagnostic("Inc/dec without operand")
@@ -880,7 +880,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
safeCallNonAssignment: FirSafeCallExpression, safeCallNonAssignment: FirSafeCallExpression,
baseSource: KtSourceElement?, baseSource: KtSourceElement?,
rhsExpression: FirExpression, rhsExpression: FirExpression,
annotations: List<FirAnnotation> annotations: List<FirAnnotation>,
): FirSafeCallExpression { ): FirSafeCallExpression {
val nestedAccess = safeCallNonAssignment.selector as FirQualifiedAccessExpression val nestedAccess = safeCallNonAssignment.selector as FirQualifiedAccessExpression
@@ -905,7 +905,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
operation: FirOperation, operation: FirOperation,
annotations: List<FirAnnotation>, annotations: List<FirAnnotation>,
rhs: T?, rhs: T?,
convert: T.() -> FirExpression convert: T.() -> FirExpression,
): FirStatement { ): FirStatement {
require(receiver is FirFunctionCall) { require(receiver is FirFunctionCall) {
"Array access should be desugared to a function call, but $receiver is found" "Array access should be desugared to a function call, but $receiver is found"
@@ -974,7 +974,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
source, source,
currentDispatchReceiverType(), currentDispatchReceiverType(),
zippedParameters, zippedParameters,
createResolvedStatus = false, isFromLibrary = false,
createClassTypeRefWithSourceKind, createClassTypeRefWithSourceKind,
createParameterTypeRefWithSourceKind, createParameterTypeRefWithSourceKind,
{ src, kind -> src?.toFirSourceElement(kind) }, { src, kind -> src?.toFirSourceElement(kind) },
@@ -1024,7 +1024,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
protected fun buildExpressionWithErrorLabel( protected fun buildExpressionWithErrorLabel(
element: FirElement?, element: FirElement?,
errorLabelSource: KtSourceElement?, errorLabelSource: KtSourceElement?,
elementSource: KtSourceElement elementSource: KtSourceElement,
): FirElement { ): FirElement {
return if (element != null) { return if (element != null) {
if (errorLabelSource != null) { if (errorLabelSource != null) {
@@ -1044,7 +1044,7 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
protected fun convertFirSelector( protected fun convertFirSelector(
firSelector: FirQualifiedAccessExpression, firSelector: FirQualifiedAccessExpression,
source: KtSourceElement?, source: KtSourceElement?,
receiver: FirExpression receiver: FirExpression,
): FirQualifiedAccessExpression { ): FirQualifiedAccessExpression {
return if (firSelector is FirImplicitInvokeCall) { return if (firSelector is FirImplicitInvokeCall) {
buildImplicitInvokeCall { buildImplicitInvokeCall {
@@ -1113,7 +1113,7 @@ fun <TBase, TSource : TBase, TParameter : TBase> FirRegularClassBuilder.createDa
sourceElement: TSource, sourceElement: TSource,
dispatchReceiver: ConeClassLikeType?, dispatchReceiver: ConeClassLikeType?,
zippedParameters: List<Pair<TParameter, FirProperty>>, zippedParameters: List<Pair<TParameter, FirProperty>>,
createResolvedStatus: Boolean, isFromLibrary: Boolean,
createClassTypeRefWithSourceKind: (KtFakeSourceElementKind) -> FirTypeRef, createClassTypeRefWithSourceKind: (KtFakeSourceElementKind) -> FirTypeRef,
createParameterTypeRefWithSourceKind: (FirProperty, KtFakeSourceElementKind) -> FirTypeRef, createParameterTypeRefWithSourceKind: (FirProperty, KtFakeSourceElementKind) -> FirTypeRef,
toFirSource: (TBase?, KtFakeSourceElementKind) -> KtSourceElement?, toFirSource: (TBase?, KtFakeSourceElementKind) -> KtSourceElement?,
@@ -1143,17 +1143,19 @@ fun <TBase, TSource : TBase, TParameter : TBase> FirRegularClassBuilder.createDa
} }
} }
val declarationOrigin = if (isFromLibrary) FirDeclarationOrigin.Library else FirDeclarationOrigin.Synthetic.DataClassMember
return buildSimpleFunction { return buildSimpleFunction {
val classTypeRef = createClassTypeRefWithSourceKind(KtFakeSourceElementKind.DataClassGeneratedMembers) val classTypeRef = createClassTypeRefWithSourceKind(KtFakeSourceElementKind.DataClassGeneratedMembers)
this.source = toFirSource(sourceElement, KtFakeSourceElementKind.DataClassGeneratedMembers) this.source = toFirSource(sourceElement, KtFakeSourceElementKind.DataClassGeneratedMembers)
moduleData = this@createDataClassCopyFunction.moduleData moduleData = this@createDataClassCopyFunction.moduleData
origin = FirDeclarationOrigin.Synthetic.DataClassMember origin = declarationOrigin
returnTypeRef = classTypeRef returnTypeRef = classTypeRef
name = StandardNames.DATA_CLASS_COPY name = StandardNames.DATA_CLASS_COPY
symbol = FirNamedFunctionSymbol(CallableId(classId.packageFqName, classId.relativeClassName, StandardNames.DATA_CLASS_COPY)) symbol = FirNamedFunctionSymbol(CallableId(classId.packageFqName, classId.relativeClassName, StandardNames.DATA_CLASS_COPY))
dispatchReceiverType = dispatchReceiver dispatchReceiverType = dispatchReceiver
resolvePhase = this@createDataClassCopyFunction.resolvePhase resolvePhase = this@createDataClassCopyFunction.resolvePhase
status = if (createResolvedStatus) { status = if (isFromLibrary) {
FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public) FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
} else { } else {
FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL) FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
@@ -1167,7 +1169,7 @@ fun <TBase, TSource : TBase, TParameter : TBase> FirRegularClassBuilder.createDa
source = parameterSource source = parameterSource
containingFunctionSymbol = this@buildSimpleFunction.symbol containingFunctionSymbol = this@buildSimpleFunction.symbol
moduleData = this@createDataClassCopyFunction.moduleData moduleData = this@createDataClassCopyFunction.moduleData
origin = FirDeclarationOrigin.Synthetic.DataClassMember origin = declarationOrigin
returnTypeRef = propertyReturnTypeRef returnTypeRef = propertyReturnTypeRef
name = propertyName name = propertyName
symbol = FirValueParameterSymbol(propertyName) symbol = FirValueParameterSymbol(propertyName)