Skip to content

Commit a7e5a94

Browse files
cypressiousSpace Team
authored andcommitted
[AA] Support explicit context argument passing
#KT-81684
1 parent 03f9caa commit a7e5a94

File tree

8 files changed

+1459
-8
lines changed

8 files changed

+1459
-8
lines changed

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
1616
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
1717
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError
1818
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
19+
import org.jetbrains.kotlin.config.LanguageFeature
20+
import org.jetbrains.kotlin.config.LanguageVersionSettings
1921
import org.jetbrains.kotlin.fir.FirPackageDirective
2022
import org.jetbrains.kotlin.fir.FirSession
2123
import org.jetbrains.kotlin.fir.declarations.*
@@ -25,6 +27,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.classId
2527
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
2628
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
2729
import org.jetbrains.kotlin.fir.expressions.*
30+
import org.jetbrains.kotlin.fir.languageVersionSettings
2831
import org.jetbrains.kotlin.fir.psi
2932
import org.jetbrains.kotlin.fir.references.*
3033
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -51,6 +54,7 @@ import org.jetbrains.kotlin.psi.psiUtil.*
5154
import org.jetbrains.kotlin.resolve.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
5255
import org.jetbrains.kotlin.utils.addIfNotNull
5356
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
57+
import org.jetbrains.kotlin.utils.addToStdlib.runIf
5458

5559
internal object FirReferenceResolveHelper {
5660
fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KaSymbolByFirBuilder): KaSymbol? {
@@ -382,12 +386,16 @@ internal object FirReferenceResolveHelper {
382386
val ktCallExpression = ktValueArgumentList.parent as? KtCallElement ?: return emptyList()
383387

384388
val firCall = ktCallExpression.getOrBuildFir(analysisSession.resolutionFacade)?.unwrapSafeCall() as? FirCall ?: return emptyList()
385-
val parameter = firCall.findCorrespondingParameter(ktValueArgumentName.asName) ?: return emptyList()
389+
val parameter = firCall.findCorrespondingParameter(ktValueArgumentName.asName, analysisSession.firSession.languageVersionSettings)
390+
?: return emptyList()
386391
return listOfNotNull(parameter.buildSymbol(symbolBuilder))
387392
}
388393

389-
private fun FirCall.findCorrespondingParameter(name: Name): FirValueParameter? {
394+
private fun FirCall.findCorrespondingParameter(name: Name, languageVersionSettings: LanguageVersionSettings): FirValueParameter? {
390395
return resolvedArgumentMapping?.values?.firstOrNull { it.name == name }
396+
?: runIf(languageVersionSettings.supportsFeature(LanguageFeature.ExplicitContextArguments)) {
397+
(this as? FirResolvable)?.toResolvedCallableSymbol()?.contextParameterSymbols?.firstOrNull { it.name == name }?.fir
398+
}
391399
}
392400

393401
private fun handleErrorExpression(

analysis/analysis-api/testData/components/resolver/allByPsi/contextParameters.call.txt

Lines changed: 328 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1248,4 +1248,331 @@ KtNameReferenceExpression(512,526): 'propertyMember'
12481248
]
12491249
callableId = /Base.propertyMember
12501250
simpleAccess = Read
1251-
typeArgumentsMapping = {}
1251+
typeArgumentsMapping = {}
1252+
1253+
KtNamedFunction(546,637): 'fun usageExplicitContextArguments() {'
1254+
null
1255+
1256+
KtParameterList(579,581): '()'
1257+
null
1258+
1259+
KtBlockExpression(582,637): '{'
1260+
null
1261+
1262+
KtCallExpression(588,635): 'with(Base()) {'
1263+
KaSuccessCallInfo:
1264+
call = KaSimpleFunctionCall:
1265+
argumentMapping = {
1266+
Base() -> (KaVariableSignature:
1267+
name = receiver
1268+
receiverType = null
1269+
returnType = Base
1270+
symbol = receiver: T
1271+
contextParameters = []
1272+
callableId = null),
1273+
{
1274+
funMember(a = A())
1275+
} -> (KaVariableSignature:
1276+
name = block
1277+
receiverType = null
1278+
returnType = @ExtensionFunctionType kotlin.Function1<Base, kotlin.Unit>
1279+
symbol = block: @ExtensionFunctionType kotlin.Function1<T, R>
1280+
contextParameters = []
1281+
callableId = null)
1282+
}
1283+
isImplicitInvoke = false
1284+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1285+
contextArguments = []
1286+
dispatchReceiver = null
1287+
extensionReceiver = null
1288+
signature = KaFunctionSignature:
1289+
receiverType = null
1290+
returnType = kotlin.Unit
1291+
symbol = kotlin/with(receiver: T, block: @ExtensionFunctionType kotlin.Function1<T, R>): R
1292+
valueParameters = [
1293+
KaVariableSignature:
1294+
name = receiver
1295+
receiverType = null
1296+
returnType = Base
1297+
symbol = receiver: T
1298+
contextParameters = []
1299+
callableId = null,
1300+
KaVariableSignature:
1301+
name = block
1302+
receiverType = null
1303+
returnType = @ExtensionFunctionType kotlin.Function1<Base, kotlin.Unit>
1304+
symbol = block: @ExtensionFunctionType kotlin.Function1<T, R>
1305+
contextParameters = []
1306+
callableId = null
1307+
]
1308+
contextParameters = []
1309+
callableId = kotlin/with
1310+
typeArgumentsMapping = {
1311+
T -> (Base),
1312+
R -> (kotlin.Unit)
1313+
}
1314+
1315+
KtNameReferenceExpression(588,592): 'with'
1316+
KaSuccessCallInfo:
1317+
call = KaSimpleFunctionCall:
1318+
argumentMapping = {
1319+
Base() -> (KaVariableSignature:
1320+
name = receiver
1321+
receiverType = null
1322+
returnType = Base
1323+
symbol = receiver: T
1324+
contextParameters = []
1325+
callableId = null),
1326+
{
1327+
funMember(a = A())
1328+
} -> (KaVariableSignature:
1329+
name = block
1330+
receiverType = null
1331+
returnType = @ExtensionFunctionType kotlin.Function1<Base, kotlin.Unit>
1332+
symbol = block: @ExtensionFunctionType kotlin.Function1<T, R>
1333+
contextParameters = []
1334+
callableId = null)
1335+
}
1336+
isImplicitInvoke = false
1337+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1338+
contextArguments = []
1339+
dispatchReceiver = null
1340+
extensionReceiver = null
1341+
signature = KaFunctionSignature:
1342+
receiverType = null
1343+
returnType = kotlin.Unit
1344+
symbol = kotlin/with(receiver: T, block: @ExtensionFunctionType kotlin.Function1<T, R>): R
1345+
valueParameters = [
1346+
KaVariableSignature:
1347+
name = receiver
1348+
receiverType = null
1349+
returnType = Base
1350+
symbol = receiver: T
1351+
contextParameters = []
1352+
callableId = null,
1353+
KaVariableSignature:
1354+
name = block
1355+
receiverType = null
1356+
returnType = @ExtensionFunctionType kotlin.Function1<Base, kotlin.Unit>
1357+
symbol = block: @ExtensionFunctionType kotlin.Function1<T, R>
1358+
contextParameters = []
1359+
callableId = null
1360+
]
1361+
contextParameters = []
1362+
callableId = kotlin/with
1363+
typeArgumentsMapping = {
1364+
T -> (Base),
1365+
R -> (kotlin.Unit)
1366+
}
1367+
1368+
KtValueArgumentList(592,600): '(Base())'
1369+
null
1370+
1371+
KtValueArgument(593,599): 'Base()'
1372+
null
1373+
1374+
KtCallExpression(593,599): 'Base()'
1375+
KaSuccessCallInfo:
1376+
call = KaSimpleFunctionCall:
1377+
argumentMapping = {}
1378+
isImplicitInvoke = false
1379+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1380+
contextArguments = []
1381+
dispatchReceiver = null
1382+
extensionReceiver = null
1383+
signature = KaFunctionSignature:
1384+
receiverType = null
1385+
returnType = Base
1386+
symbol = <constructor>(): Base
1387+
valueParameters = []
1388+
contextParameters = []
1389+
callableId = null
1390+
typeArgumentsMapping = {}
1391+
1392+
KtNameReferenceExpression(593,597): 'Base'
1393+
KaSuccessCallInfo:
1394+
call = KaSimpleFunctionCall:
1395+
argumentMapping = {}
1396+
isImplicitInvoke = false
1397+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1398+
contextArguments = []
1399+
dispatchReceiver = null
1400+
extensionReceiver = null
1401+
signature = KaFunctionSignature:
1402+
receiverType = null
1403+
returnType = Base
1404+
symbol = <constructor>(): Base
1405+
valueParameters = []
1406+
contextParameters = []
1407+
callableId = null
1408+
typeArgumentsMapping = {}
1409+
1410+
KtValueArgumentList(597,599): '()'
1411+
null
1412+
1413+
KtLambdaArgument(601,635): '{'
1414+
null
1415+
1416+
KtLambdaExpression(601,635): '{'
1417+
null
1418+
1419+
KtFunctionLiteral(601,635): '{'
1420+
null
1421+
1422+
KtBlockExpression(611,629): 'funMember(a = A())'
1423+
null
1424+
1425+
KtCallExpression(611,629): 'funMember(a = A())'
1426+
KaSuccessCallInfo:
1427+
call = KaSimpleFunctionCall:
1428+
argumentMapping = {}
1429+
isImplicitInvoke = false
1430+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1431+
contextArguments = [
1432+
KaExplicitReceiverValue:
1433+
expression = A()
1434+
isSafeNavigation = false
1435+
type = A
1436+
]
1437+
dispatchReceiver = KaImplicitReceiverValue:
1438+
symbol = KaReceiverParameterSymbol:
1439+
annotations: []
1440+
callableId: null
1441+
compilerVisibility: Public
1442+
contextReceivers: []
1443+
isActual: false
1444+
isExpect: false
1445+
isExtension: false
1446+
isVal: true
1447+
location: LOCAL
1448+
modality: FINAL
1449+
name: <receiver>
1450+
origin: SOURCE
1451+
owningCallableSymbol: KaAnonymousFunctionSymbol(<local>/<no name provided>)
1452+
receiverParameter: null
1453+
returnType: KaUsualClassType:
1454+
annotations: []
1455+
typeArguments: []
1456+
type: Base
1457+
visibility: PUBLIC
1458+
type = Base
1459+
extensionReceiver = null
1460+
signature = KaFunctionSignature:
1461+
receiverType = null
1462+
returnType = kotlin.Unit
1463+
symbol = /Base.funMember(<dispatch receiver>: Base): kotlin.Unit
1464+
valueParameters = []
1465+
contextParameters = [
1466+
KaVariableSignature:
1467+
name = a
1468+
receiverType = null
1469+
returnType = A
1470+
symbol = a: A
1471+
contextParameters = []
1472+
callableId = null
1473+
]
1474+
callableId = /Base.funMember
1475+
typeArgumentsMapping = {}
1476+
1477+
KtNameReferenceExpression(611,620): 'funMember'
1478+
KaSuccessCallInfo:
1479+
call = KaSimpleFunctionCall:
1480+
argumentMapping = {}
1481+
isImplicitInvoke = false
1482+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1483+
contextArguments = [
1484+
KaExplicitReceiverValue:
1485+
expression = A()
1486+
isSafeNavigation = false
1487+
type = A
1488+
]
1489+
dispatchReceiver = KaImplicitReceiverValue:
1490+
symbol = KaReceiverParameterSymbol:
1491+
annotations: []
1492+
callableId: null
1493+
compilerVisibility: Public
1494+
contextReceivers: []
1495+
isActual: false
1496+
isExpect: false
1497+
isExtension: false
1498+
isVal: true
1499+
location: LOCAL
1500+
modality: FINAL
1501+
name: <receiver>
1502+
origin: SOURCE
1503+
owningCallableSymbol: KaAnonymousFunctionSymbol(<local>/<no name provided>)
1504+
receiverParameter: null
1505+
returnType: KaUsualClassType:
1506+
annotations: []
1507+
typeArguments: []
1508+
type: Base
1509+
visibility: PUBLIC
1510+
type = Base
1511+
extensionReceiver = null
1512+
signature = KaFunctionSignature:
1513+
receiverType = null
1514+
returnType = kotlin.Unit
1515+
symbol = /Base.funMember(<dispatch receiver>: Base): kotlin.Unit
1516+
valueParameters = []
1517+
contextParameters = [
1518+
KaVariableSignature:
1519+
name = a
1520+
receiverType = null
1521+
returnType = A
1522+
symbol = a: A
1523+
contextParameters = []
1524+
callableId = null
1525+
]
1526+
callableId = /Base.funMember
1527+
typeArgumentsMapping = {}
1528+
1529+
KtValueArgumentList(620,629): '(a = A())'
1530+
null
1531+
1532+
KtValueArgument(621,628): 'a = A()'
1533+
null
1534+
1535+
KtValueArgumentName(621,622): 'a'
1536+
null
1537+
1538+
KtNameReferenceExpression(621,622): 'a'
1539+
null
1540+
1541+
KtCallExpression(625,628): 'A()'
1542+
KaSuccessCallInfo:
1543+
call = KaSimpleFunctionCall:
1544+
argumentMapping = {}
1545+
isImplicitInvoke = false
1546+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1547+
contextArguments = []
1548+
dispatchReceiver = null
1549+
extensionReceiver = null
1550+
signature = KaFunctionSignature:
1551+
receiverType = null
1552+
returnType = A
1553+
symbol = <constructor>(): A
1554+
valueParameters = []
1555+
contextParameters = []
1556+
callableId = null
1557+
typeArgumentsMapping = {}
1558+
1559+
KtNameReferenceExpression(625,626): 'A'
1560+
KaSuccessCallInfo:
1561+
call = KaSimpleFunctionCall:
1562+
argumentMapping = {}
1563+
isImplicitInvoke = false
1564+
partiallyAppliedSymbol = KaPartiallyAppliedSymbol:
1565+
contextArguments = []
1566+
dispatchReceiver = null
1567+
extensionReceiver = null
1568+
signature = KaFunctionSignature:
1569+
receiverType = null
1570+
returnType = A
1571+
symbol = <constructor>(): A
1572+
valueParameters = []
1573+
contextParameters = []
1574+
callableId = null
1575+
typeArgumentsMapping = {}
1576+
1577+
KtValueArgumentList(626,628): '()'
1578+
null

0 commit comments

Comments
 (0)