Skip to content

Commit 602e3aa

Browse files
dzharkovSpace Team
authored andcommitted
FE: Add some debug information for the case of SOE from type approximator
1 parent 14756c3 commit 602e3aa

File tree

5 files changed

+30
-6
lines changed

5 files changed

+30
-6
lines changed

compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import org.jetbrains.kotlin.types.model.TypeConstructorMarker
1111
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
1212

1313
open class ConeTypeRenderer(
14-
private val attributeRenderer: ConeAttributeRenderer = ConeAttributeRenderer.ToString
14+
private val attributeRenderer: ConeAttributeRenderer = ConeAttributeRenderer.ToString,
15+
private var renderCapturedDetails: Boolean = false,
1516
) {
1617
lateinit var builder: StringBuilder
1718
lateinit var idRenderer: ConeIdRenderer
@@ -136,6 +137,16 @@ open class ConeTypeRenderer(
136137
builder.append("CapturedType(")
137138
constructor.projection.render()
138139
builder.append(")")
140+
if (renderCapturedDetails) {
141+
builder.append(
142+
" with lowerType=${constructor.lowerType?.let(::render)}, supertypes=["
143+
)
144+
// To prevent recursion
145+
renderCapturedDetails = false
146+
constructor.supertypes?.forEach(::render)
147+
renderCapturedDetails = true
148+
builder.append("]")
149+
}
139150
}
140151

141152
is ConeClassLikeErrorLookupTag -> builder.append("ERROR CLASS: ${constructor.diagnostic.reason}")

compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForDebugInfo.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import org.jetbrains.kotlin.fir.types.ConeIntersectionType
1111
import org.jetbrains.kotlin.fir.types.ConeKotlinType
1212

1313
open class ConeTypeRendererForDebugInfo protected constructor(
14-
coneAttributeRendererForReadability: ConeAttributeRenderer = ConeAttributeRenderer.ForReadability
15-
) : ConeTypeRenderer(coneAttributeRendererForReadability) {
16-
constructor(builder: StringBuilder) : this() {
14+
renderCapturedDetails: Boolean = false,
15+
coneAttributeRendererForReadability: ConeAttributeRenderer = ConeAttributeRenderer.ForReadability,
16+
) : ConeTypeRenderer(coneAttributeRendererForReadability, renderCapturedDetails) {
17+
constructor(builder: StringBuilder, renderCapturedDetails: Boolean = false) : this(renderCapturedDetails) {
1718
this.builder = builder
1819
idRenderer = ConeIdRendererForDiagnostics()
1920
idRenderer.builder = builder

compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRendererForReadability.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.types.model.TypeConstructorMarker
1515
open class ConeTypeRendererForReadability(
1616
private val preRenderedConstructors: Map<TypeConstructorMarker, String>? = null,
1717
private val idRendererCreator: () -> ConeIdRenderer,
18-
) : ConeTypeRendererForDebugInfo(ConeAttributeRenderer.None) {
18+
) : ConeTypeRendererForDebugInfo(coneAttributeRendererForReadability = ConeAttributeRenderer.None) {
1919
constructor(
2020
builder: StringBuilder,
2121
preRenderedConstructors: Map<TypeConstructorMarker, String>? = null,

compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeTypeApproximator.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ package org.jetbrains.kotlin.fir.types
77

88
import org.jetbrains.kotlin.config.LanguageFeature
99
import org.jetbrains.kotlin.config.LanguageVersionSettings
10+
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugInfo
1011
import org.jetbrains.kotlin.types.AbstractTypeApproximator
1112
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
13+
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
1214

1315
class ConeTypeApproximator(inferenceContext: ConeInferenceContext, languageVersionSettings: LanguageVersionSettings) :
1416
AbstractTypeApproximator(inferenceContext, languageVersionSettings) {
@@ -22,6 +24,10 @@ class ConeTypeApproximator(inferenceContext: ConeInferenceContext, languageVersi
2224
return super.approximateToSubType(type, conf, caches = null) as ConeKotlinType?
2325
}
2426

27+
override fun KotlinTypeMarker.renderForDebugInfo(): String = buildString {
28+
ConeTypeRendererForDebugInfo(this, renderCapturedDetails = true).render(this@renderForDebugInfo as ConeKotlinType)
29+
}
30+
2531
private fun ConeKotlinType.fastPathSkipApproximation(conf: TypeApproximatorConfiguration): Boolean {
2632
if (this is ConeClassLikeType && this.typeArguments.isEmpty() &&
2733
this.lookupTag.let { !it.isLocalClass() && !it.isAnonymousClass() }

compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,16 @@ abstract class AbstractTypeApproximator(
100100
approximateTo: context(TypeApproximatorConfiguration, Cache) (KotlinTypeMarker, Int) -> KotlinTypeMarker?,
101101
): KotlinTypeMarker? {
102102
return context(conf, caches?.getOrPut(conf, ::Cache) ?: Cache()) {
103-
approximateTo(type, -type.typeDepthForApproximation())
103+
try {
104+
approximateTo(type, -type.typeDepthForApproximation())
105+
} catch (e: StackOverflowError) {
106+
throw RuntimeException("StackOverflowError during type approximation for ${type.renderForDebugInfo()}", e)
107+
}
104108
}
105109
}
106110

111+
protected open fun KotlinTypeMarker.renderForDebugInfo(): String = toString()
112+
107113
fun clearCache() {
108114
cacheForIncorporationConfigToSubtypeDirection.clear()
109115
cacheForIncorporationConfigToSuperDirection.clear()

0 commit comments

Comments
 (0)