FIR: Support safe-calls in renderers
^KT-38444 In Progress
This commit is contained in:
@@ -1312,8 +1312,11 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FlowContent.generate(functionCall: FirFunctionCall) {
|
private fun FlowContent.generate(functionCall: FirFunctionCall, skipReceiver: Boolean = false) {
|
||||||
generateReceiver(functionCall)
|
|
||||||
|
if (!skipReceiver) {
|
||||||
|
generateReceiver(functionCall)
|
||||||
|
}
|
||||||
|
|
||||||
generate(functionCall.calleeReference)
|
generate(functionCall.calleeReference)
|
||||||
generateTypeProjections(functionCall.typeArguments)
|
generateTypeProjections(functionCall.typeArguments)
|
||||||
@@ -1567,6 +1570,10 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
|||||||
is FirVarargArgumentsExpression -> generate(expression)
|
is FirVarargArgumentsExpression -> generate(expression)
|
||||||
is FirResolvedReifiedParameterReference -> generate(expression)
|
is FirResolvedReifiedParameterReference -> generate(expression)
|
||||||
is FirComparisonExpression -> generate(expression)
|
is FirComparisonExpression -> generate(expression)
|
||||||
|
is FirSafeCallExpression -> generate(expression)
|
||||||
|
is FirCheckedSafeCallSubject -> {
|
||||||
|
+"\$subj\$"
|
||||||
|
}
|
||||||
else -> inlineUnsupported(expression)
|
else -> inlineUnsupported(expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1578,6 +1585,30 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
|||||||
generate(comparisonExpression.right)
|
generate(comparisonExpression.right)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun FlowContent.generate(safeCallExpression: FirSafeCallExpression) {
|
||||||
|
generate(safeCallExpression.receiver)
|
||||||
|
|
||||||
|
+"?."
|
||||||
|
|
||||||
|
val nestedQualifier = safeCallExpression.regularQualifiedAccess
|
||||||
|
if (nestedQualifier.explicitReceiver == safeCallExpression.checkedSubject.value) {
|
||||||
|
when (nestedQualifier) {
|
||||||
|
is FirFunctionCall -> {
|
||||||
|
return generate(nestedQualifier, skipReceiver = true)
|
||||||
|
}
|
||||||
|
is FirQualifiedAccessExpression -> {
|
||||||
|
return generate(nestedQualifier, skipReceiver = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+"{ "
|
||||||
|
|
||||||
|
generate(nestedQualifier)
|
||||||
|
|
||||||
|
+" }"
|
||||||
|
}
|
||||||
|
|
||||||
private fun FlowContent.generate(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference) {
|
private fun FlowContent.generate(resolvedReifiedParameterReference: FirResolvedReifiedParameterReference) {
|
||||||
val typeParameter = resolvedReifiedParameterReference.symbol.fir
|
val typeParameter = resolvedReifiedParameterReference.symbol.fir
|
||||||
+typeParameter.name.identifier
|
+typeParameter.name.identifier
|
||||||
@@ -1593,8 +1624,10 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
|||||||
generate(binaryLogicExpression.rightOperand)
|
generate(binaryLogicExpression.rightOperand)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FlowContent.generate(qualifiedAccessExpression: FirQualifiedAccessExpression) {
|
private fun FlowContent.generate(qualifiedAccessExpression: FirQualifiedAccessExpression, skipReceiver: Boolean = false) {
|
||||||
generateReceiver(qualifiedAccessExpression)
|
if (!skipReceiver) {
|
||||||
|
generateReceiver(qualifiedAccessExpression)
|
||||||
|
}
|
||||||
generate(qualifiedAccessExpression.calleeReference)
|
generate(qualifiedAccessExpression.calleeReference)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -510,6 +510,17 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression) {
|
||||||
|
safeCallExpression.receiver.accept(this)
|
||||||
|
print("?.{ ")
|
||||||
|
safeCallExpression.regularQualifiedAccess.accept(this)
|
||||||
|
print(" }")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject) {
|
||||||
|
print("\$subj\$")
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitTypedDeclaration(typedDeclaration: FirTypedDeclaration) {
|
override fun visitTypedDeclaration(typedDeclaration: FirTypedDeclaration) {
|
||||||
visitDeclaration(typedDeclaration)
|
visitDeclaration(typedDeclaration)
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -406,6 +406,17 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
|
|||||||
//skip rendering for as/as?/is/!is
|
//skip rendering for as/as?/is/!is
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression, data: StringBuilder) {
|
||||||
|
safeCallExpression.receiver.accept(this, data)
|
||||||
|
data.append("?.{ ")
|
||||||
|
safeCallExpression.regularQualifiedAccess.accept(this, data)
|
||||||
|
data.append(" }")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: StringBuilder) {
|
||||||
|
data.append("\$subj\$")
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitFunctionCall(functionCall: FirFunctionCall, data: StringBuilder) {
|
override fun visitFunctionCall(functionCall: FirFunctionCall, data: StringBuilder) {
|
||||||
when (val callee = functionCall.calleeReference) {
|
when (val callee = functionCall.calleeReference) {
|
||||||
is FirResolvedNamedReference -> {
|
is FirResolvedNamedReference -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user