[Analysis API] create declarations from a library with library origin in StubBasedFirDeserializedSymbolProvider
This commit is contained in:
committed by
Space Team
parent
a3b67594ff
commit
64f90f685d
Vendored
+4
-3
@@ -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
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
|
|||||||
+23
-21
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user