FIR IDE: add validity token to KtCall
This commit is contained in:
committed by
Ilya Kirillov
parent
245c4082cd
commit
9f0f1781c9
+15
-17
@@ -65,18 +65,19 @@ internal class KtFirCallResolver(
|
||||
val accessorSymbol = analysisSession.firSymbolBuilder.functionLikeBuilder.buildFunctionLikeSymbol(accessor)
|
||||
val target =
|
||||
if (!access.isWrite || setterValue != null)
|
||||
KtSuccessCallTarget(accessorSymbol)
|
||||
KtSuccessCallTarget(accessorSymbol, token)
|
||||
else // access.isWrite && setterValue == null
|
||||
KtErrorCallTarget(
|
||||
listOf(accessorSymbol),
|
||||
KtNonBoundToPsiErrorDiagnostic(factoryName = null, "Setter value is missing", token)
|
||||
KtNonBoundToPsiErrorDiagnostic(factoryName = null, "Setter value is missing", token),
|
||||
token
|
||||
)
|
||||
val ktArgumentMapping = LinkedHashMap<KtExpression, KtValueParameterSymbol>()
|
||||
if (access.isWrite && setterValue != null) {
|
||||
val setterParameterSymbol = accessor.valueParameters.single().buildSymbol(firSymbolBuilder) as KtValueParameterSymbol
|
||||
ktArgumentMapping[setterValue] = setterParameterSymbol
|
||||
}
|
||||
return KtFunctionCall(ktArgumentMapping, target)
|
||||
return KtFunctionCall(ktArgumentMapping, target, token)
|
||||
}
|
||||
else -> return null
|
||||
}
|
||||
@@ -166,7 +167,7 @@ internal class KtFirCallResolver(
|
||||
is FirResolvedNamedReference -> {
|
||||
val functionSymbol = callReference.resolvedSymbol as? FirNamedFunctionSymbol
|
||||
(functionSymbol?.fir?.buildSymbol(firSymbolBuilder) as? KtFunctionSymbol)?.let {
|
||||
functionSymbol to KtSuccessCallTarget(it)
|
||||
functionSymbol to KtSuccessCallTarget(it, token)
|
||||
} ?: return null
|
||||
}
|
||||
is FirErrorNamedReference -> {
|
||||
@@ -177,26 +178,26 @@ internal class KtFirCallResolver(
|
||||
}
|
||||
val callableId = functionSymbol?.callableId ?: return null
|
||||
return if (callableId in kotlinFunctionInvokeCallableIds) {
|
||||
KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), target)
|
||||
KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), target, token)
|
||||
} else {
|
||||
KtVariableWithInvokeFunctionCall(variableLikeSymbol, createArgumentMapping(), target)
|
||||
KtVariableWithInvokeFunctionCall(variableLikeSymbol, createArgumentMapping(), target, token)
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirFunctionCall.asSimpleFunctionCall(): KtFunctionCall? {
|
||||
val target = calleeReference.createCallTarget() ?: return null
|
||||
return KtFunctionCall(createArgumentMapping(), target)
|
||||
return KtFunctionCall(createArgumentMapping(), target, token)
|
||||
}
|
||||
|
||||
private fun FirAnnotationCall.asAnnotationCall(): KtAnnotationCall? {
|
||||
val target = calleeReference.createCallTarget() ?: return null
|
||||
return KtAnnotationCall(createArgumentMapping(), target)
|
||||
return KtAnnotationCall(createArgumentMapping(), target, token)
|
||||
}
|
||||
|
||||
private fun FirDelegatedConstructorCall.asDelegatedConstructorCall(): KtDelegatedConstructorCall? {
|
||||
val target = calleeReference.createCallTarget() ?: return null
|
||||
val kind = if (isSuper) KtDelegatedConstructorCallKind.SUPER_CALL else KtDelegatedConstructorCallKind.THIS_CALL
|
||||
return KtDelegatedConstructorCall(createArgumentMapping(), target, kind)
|
||||
return KtDelegatedConstructorCall(createArgumentMapping(), target, kind, token)
|
||||
}
|
||||
|
||||
private fun FirConstructor.asDelegatedConstructorCall(): KtDelegatedConstructorCall? {
|
||||
@@ -214,7 +215,7 @@ internal class KtFirCallResolver(
|
||||
private fun FirReference.createCallTarget(): KtCallTarget? {
|
||||
return when (this) {
|
||||
is FirSuperReference -> createCallTarget(source)
|
||||
is FirResolvedNamedReference -> getKtFunctionOrConstructorSymbol()?.let { KtSuccessCallTarget(it) }
|
||||
is FirResolvedNamedReference -> getKtFunctionOrConstructorSymbol()?.let { KtSuccessCallTarget(it, token) }
|
||||
is FirErrorNamedReference -> createErrorCallTarget(source)
|
||||
is FirErrorReferenceWithCandidate -> createErrorCallTarget(source)
|
||||
is FirSimpleNamedReference ->
|
||||
@@ -285,15 +286,13 @@ internal class KtFirCallResolver(
|
||||
KtErrorCallTarget(
|
||||
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
||||
source?.let { diagnostic.asKtDiagnostic(it, qualifiedAccessSource, diagnosticCache) }
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token)
|
||||
)
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token), token)
|
||||
|
||||
private fun FirErrorReferenceWithCandidate.createErrorCallTarget(qualifiedAccessSource: FirSourceElement?): KtErrorCallTarget =
|
||||
KtErrorCallTarget(
|
||||
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
||||
source?.let { diagnostic.asKtDiagnostic(it, qualifiedAccessSource, diagnosticCache) }
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token)
|
||||
)
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token), token)
|
||||
|
||||
private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? =
|
||||
resolvedSymbol.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol
|
||||
@@ -306,12 +305,11 @@ internal class KtFirCallResolver(
|
||||
analysisSession.getPrimaryConstructor(it)?.let { ctor -> listOf(ctor) }
|
||||
} ?: emptyList(),
|
||||
source?.let { type.diagnostic.asKtDiagnostic(it, qualifiedAccessSource, diagnosticCache) }
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, type.diagnostic.reason, token)
|
||||
)
|
||||
?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, type.diagnostic.reason, token), token)
|
||||
is ConeClassLikeType ->
|
||||
type.classId?.let { classId ->
|
||||
(firSymbolBuilder.classifierBuilder.buildClassLikeSymbolByClassId(classId) as? KtSymbolWithMembers)?.let {
|
||||
analysisSession.getPrimaryConstructor(it)?.let { ctor -> KtSuccessCallTarget(ctor) }
|
||||
analysisSession.getPrimaryConstructor(it)?.let { ctor -> KtSuccessCallTarget(ctor, token) }
|
||||
}
|
||||
}
|
||||
else ->
|
||||
|
||||
+9
-5
@@ -87,11 +87,15 @@ private fun KtCall.stringRepresentation(): String {
|
||||
return buildString {
|
||||
append(callInfoClass.simpleName!!)
|
||||
append(":\n")
|
||||
val propertyByName = callInfoClass.memberProperties.associateBy(KProperty1<*, *>::name)
|
||||
callInfoClass.primaryConstructor!!.parameters.joinTo(this, separator = "\n") { parameter ->
|
||||
val value = propertyByName[parameter.name]!!.javaGetter!!(this@stringRepresentation)?.stringValue()
|
||||
"${parameter.name!!} = $value"
|
||||
}
|
||||
val propertyByName =
|
||||
callInfoClass.memberProperties.associateBy(KProperty1<*, *>::name)
|
||||
callInfoClass.primaryConstructor!!.parameters
|
||||
.filter { it.name != "token" }
|
||||
.joinTo(this, separator = "\n") { parameter ->
|
||||
val name = parameter.name!!.removePrefix("_")
|
||||
val value = propertyByName[name]!!.javaGetter!!(this@stringRepresentation)?.stringValue()
|
||||
"$name = $value"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user