diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt index 865cd37f8b7..7d8b69eae2f 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt @@ -89,6 +89,9 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() { } print(">") } + if (type.isMarkedNullable) { + print("?") + } } private fun SmartPrinter.printTypeArgument(typeArgument: KTypeProjection) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt index 12a77829b42..728335ae7ec 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt @@ -33,25 +33,25 @@ sealed class FirSimpleDiagnostic : FirDiagnostic() abstract override val factory: FirDiagnosticFactory0<*> } -sealed class FirDiagnosticWithParameters1 : FirDiagnostic() { +sealed class FirDiagnosticWithParameters1 : FirDiagnostic() { abstract val a: A abstract override val factory: FirDiagnosticFactory1<*, A> } -sealed class FirDiagnosticWithParameters2 : FirDiagnostic() { +sealed class FirDiagnosticWithParameters2 : FirDiagnostic() { abstract val a: A abstract val b: B abstract override val factory: FirDiagnosticFactory2<*, A, B> } -sealed class FirDiagnosticWithParameters3 : FirDiagnostic() { +sealed class FirDiagnosticWithParameters3 : FirDiagnostic() { abstract val a: A abstract val b: B abstract val c: C abstract override val factory: FirDiagnosticFactory3<*, A, B, C> } -sealed class FirDiagnosticWithParameters4 : FirDiagnostic() { +sealed class FirDiagnosticWithParameters4 : FirDiagnostic() { abstract val a: A abstract val b: B abstract val c: C @@ -77,14 +77,14 @@ data class FirPsiSimpleDiagnostic

( override val factory: FirDiagnosticFactory0

) : FirSimpleDiagnostic>(), FirPsiDiagnostic

-data class FirPsiDiagnosticWithParameters1

( +data class FirPsiDiagnosticWithParameters1

( override val element: FirPsiSourceElement

, override val a: A, override val severity: Severity, override val factory: FirDiagnosticFactory1 ) : FirDiagnosticWithParameters1, A>(), FirPsiDiagnostic

-data class FirPsiDiagnosticWithParameters2

( +data class FirPsiDiagnosticWithParameters2

( override val element: FirPsiSourceElement

, override val a: A, override val b: B, @@ -92,7 +92,7 @@ data class FirPsiDiagnosticWithParameters2

( override val factory: FirDiagnosticFactory2 ) : FirDiagnosticWithParameters2, A, B>(), FirPsiDiagnostic

-data class FirPsiDiagnosticWithParameters3

( +data class FirPsiDiagnosticWithParameters3

( override val element: FirPsiSourceElement

, override val a: A, override val b: B, @@ -101,7 +101,7 @@ data class FirPsiDiagnosticWithParameters3

) : FirDiagnosticWithParameters3, A, B, C>(), FirPsiDiagnostic

-data class FirPsiDiagnosticWithParameters4

( +data class FirPsiDiagnosticWithParameters4

( override val element: FirPsiSourceElement

, override val a: A, override val b: B, @@ -123,14 +123,14 @@ data class FirLightSimpleDiagnostic( override val factory: FirDiagnosticFactory0<*> ) : FirSimpleDiagnostic(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters1( +data class FirLightDiagnosticWithParameters1( override val element: FirLightSourceElement, override val a: A, override val severity: Severity, override val factory: FirDiagnosticFactory1<*, A> ) : FirDiagnosticWithParameters1(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters2( +data class FirLightDiagnosticWithParameters2( override val element: FirLightSourceElement, override val a: A, override val b: B, @@ -138,7 +138,7 @@ data class FirLightDiagnosticWithParameters2( override val factory: FirDiagnosticFactory2<*, A, B> ) : FirDiagnosticWithParameters2(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters3( +data class FirLightDiagnosticWithParameters3( override val element: FirLightSourceElement, override val a: A, override val b: B, @@ -147,7 +147,7 @@ data class FirLightDiagnosticWithParameters3( override val factory: FirDiagnosticFactory3<*, A, B, C> ) : FirDiagnosticWithParameters3(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters4( +data class FirLightDiagnosticWithParameters4( override val element: FirLightSourceElement, override val a: A, override val b: B, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt index 29329317f03..27eace6946e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt @@ -55,7 +55,7 @@ class FirDiagnosticFactory0

( } } -class FirDiagnosticFactory1

( +class FirDiagnosticFactory1

( name: String, severity: Severity, positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT, @@ -76,7 +76,7 @@ class FirDiagnosticFactory1

( } } -class FirDiagnosticFactory2

( +class FirDiagnosticFactory2

( name: String, severity: Severity, positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT, @@ -98,7 +98,7 @@ class FirDiagnosticFactory2

( } } -class FirDiagnosticFactory3

( +class FirDiagnosticFactory3

( name: String, severity: Severity, positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT, @@ -121,7 +121,7 @@ class FirDiagnosticFactory3

( } } -class FirDiagnosticFactory4

( +class FirDiagnosticFactory4

( name: String, severity: Severity, positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT, @@ -152,13 +152,13 @@ fun

FirDiagnosticFactory0

.on(element: FirSourceElement?): Fi return element?.let { on(it) } } -fun

FirDiagnosticFactory1.on( +fun

FirDiagnosticFactory1.on( element: FirSourceElement?, a: A ): FirDiagnosticWithParameters1<*, A>? { return element?.let { on(it, a) } } -fun

FirDiagnosticFactory2.on( +fun

FirDiagnosticFactory2.on( element: FirSourceElement?, a: A, b: B @@ -166,7 +166,7 @@ fun

FirDiagnosticFactory2.on( return element?.let { on(it, a, b) } } -fun

FirDiagnosticFactory3.on( +fun

FirDiagnosticFactory3.on( element: FirSourceElement?, a: A, b: B, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt index 0eae8482d34..68c9cba9632 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt @@ -16,19 +16,19 @@ fun

warning0( return DiagnosticFactory0DelegateProvider(Severity.WARNING, positioningStrategy) } -fun

warning1( +fun

warning1( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory1DelegateProvider { return DiagnosticFactory1DelegateProvider(Severity.WARNING, positioningStrategy) } -fun

warning2( +fun

warning2( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory2DelegateProvider { return DiagnosticFactory2DelegateProvider(Severity.WARNING, positioningStrategy) } -fun

warning3( +fun

warning3( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory3DelegateProvider { return DiagnosticFactory3DelegateProvider(Severity.WARNING, positioningStrategy) @@ -40,25 +40,25 @@ fun

error0( return DiagnosticFactory0DelegateProvider(Severity.ERROR, positioningStrategy) } -fun

error1( +fun

error1( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory1DelegateProvider { return DiagnosticFactory1DelegateProvider(Severity.ERROR, positioningStrategy) } -fun

error2( +fun

error2( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory2DelegateProvider { return DiagnosticFactory2DelegateProvider(Severity.ERROR, positioningStrategy) } -fun

error3( +fun

error3( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory3DelegateProvider { return DiagnosticFactory3DelegateProvider(Severity.ERROR, positioningStrategy) } -fun

error4( +fun

error4( positioningStrategy: SourceElementPositioningStrategy

= SourceElementPositioningStrategy.DEFAULT ): DiagnosticFactory4DelegateProvider { return DiagnosticFactory4DelegateProvider(Severity.ERROR, positioningStrategy) @@ -75,7 +75,7 @@ class DiagnosticFactory0DelegateProvider

( } } -class DiagnosticFactory1DelegateProvider

( +class DiagnosticFactory1DelegateProvider

( private val severity: Severity, private val positioningStrategy: SourceElementPositioningStrategy

) { @@ -84,7 +84,7 @@ class DiagnosticFactory1DelegateProvider

( } } -class DiagnosticFactory2DelegateProvider

( +class DiagnosticFactory2DelegateProvider

( private val severity: Severity, private val positioningStrategy: SourceElementPositioningStrategy

) { @@ -93,7 +93,7 @@ class DiagnosticFactory2DelegateProvider

( } } -class DiagnosticFactory3DelegateProvider

( +class DiagnosticFactory3DelegateProvider

( private val severity: Severity, private val positioningStrategy: SourceElementPositioningStrategy

) { @@ -102,7 +102,7 @@ class DiagnosticFactory3DelegateProvider

( +class DiagnosticFactory4DelegateProvider

( private val severity: Severity, private val positioningStrategy: SourceElementPositioningStrategy

) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt index 8c7041b0a27..7ec913c5e20 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt @@ -18,7 +18,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { put(factory, SimpleFirDiagnosticRenderer(message)) } - fun put( + fun put( factory: FirDiagnosticFactory1<*, A>, message: String, rendererA: DiagnosticParameterRenderer? @@ -26,7 +26,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { put(factory, FirDiagnosticWithParameters1Renderer(message, rendererA)) } - fun put( + fun put( factory: FirDiagnosticFactory2<*, A, B>, message: String, rendererA: DiagnosticParameterRenderer?, @@ -35,7 +35,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { put(factory, FirDiagnosticWithParameters2Renderer(message, rendererA, rendererB)) } - fun put( + fun put( factory: FirDiagnosticFactory3<*, A, B, C>, message: String, rendererA: DiagnosticParameterRenderer?, @@ -45,7 +45,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { put(factory, FirDiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)) } - fun put( + fun put( factory: FirDiagnosticFactory4<*, A, B, C, D>, message: String, rendererA: DiagnosticParameterRenderer?, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderer.kt index 2473f08d754..e13eb34ced3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderer.kt @@ -21,22 +21,22 @@ sealed class AbstractFirDiagnosticWithParametersRenderer>( protected val message: String ) : FirDiagnosticRenderer, AbstractDiagnosticWithParametersRenderer(message) -class FirDiagnosticWithParameters1Renderer( +class FirDiagnosticWithParameters1Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, ) : AbstractFirDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: FirDiagnosticWithParameters1<*, A>): Array { + override fun renderParameters(diagnostic: FirDiagnosticWithParameters1<*, A>): Array { val context = RenderingContext.of(diagnostic.a) return arrayOf(renderParameter(diagnostic.a, rendererForA, context)) } } -class FirDiagnosticWithParameters2Renderer( +class FirDiagnosticWithParameters2Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, private val rendererForB: DiagnosticParameterRenderer?, ) : AbstractFirDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: FirDiagnosticWithParameters2<*, A, B>): Array { + override fun renderParameters(diagnostic: FirDiagnosticWithParameters2<*, A, B>): Array { val context = RenderingContext.of(diagnostic.a, diagnostic.b) return arrayOf( renderParameter(diagnostic.a, rendererForA, context), @@ -45,13 +45,13 @@ class FirDiagnosticWithParameters2Renderer( } } -class FirDiagnosticWithParameters3Renderer( +class FirDiagnosticWithParameters3Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, private val rendererForB: DiagnosticParameterRenderer?, private val rendererForC: DiagnosticParameterRenderer?, ) : AbstractFirDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: FirDiagnosticWithParameters3<*, A, B, C>): Array { + override fun renderParameters(diagnostic: FirDiagnosticWithParameters3<*, A, B, C>): Array { val context = RenderingContext.of(diagnostic.a, diagnostic.b, diagnostic.c) return arrayOf( renderParameter(diagnostic.a, rendererForA, context), @@ -61,14 +61,14 @@ class FirDiagnosticWithParameters3Renderer( } } -class FirDiagnosticWithParameters4Renderer( +class FirDiagnosticWithParameters4Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, private val rendererForB: DiagnosticParameterRenderer?, private val rendererForC: DiagnosticParameterRenderer?, private val rendererForD: DiagnosticParameterRenderer?, ) : AbstractFirDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: FirDiagnosticWithParameters4<*, A, B, C, D>): Array { + override fun renderParameters(diagnostic: FirDiagnosticWithParameters4<*, A, B, C, D>): Array { val context = RenderingContext.of(diagnostic.a, diagnostic.b, diagnostic.c) return arrayOf( renderParameter(diagnostic.a, rendererForA, context), diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index 118bdd56832..7b65f23e562 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -38,7 +38,7 @@ object FirDiagnosticRenderers { } } - val TO_STRING = Renderer { element: Any -> + val TO_STRING = Renderer { element: Any? -> element.toString() } @@ -109,7 +109,7 @@ object FirDiagnosticRenderers { } } - val NOT_RENDERED = Renderer { + val NOT_RENDERED = Renderer { "" } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt index 6f54ec927bc..d8817d254fa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DiagnosticRendererUtil.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.renderer.DescriptorRenderer -fun

renderParameter(parameter: P, renderer: DiagnosticParameterRenderer

?, context: RenderingContext): Any = +fun

renderParameter(parameter: P, renderer: DiagnosticParameterRenderer

?, context: RenderingContext): Any? = renderer?.render(parameter, context) ?: parameter fun ClassifierDescriptorWithTypeParameters.renderKindWithName(): String = diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/diagnosticsWithParameterRenderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/diagnosticsWithParameterRenderers.kt index df5f3da0de0..adc9d920afa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/diagnosticsWithParameterRenderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/diagnosticsWithParameterRenderers.kt @@ -27,29 +27,29 @@ abstract class AbstractDiagnosticWithParametersRenderer + abstract fun renderParameters(diagnostic: D): Array } -class DiagnosticWithParameters1Renderer( +class DiagnosticWithParameters1Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer? ) : AbstractDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array { + override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array { val context = RenderingContext.of(diagnostic.a) return arrayOf(renderParameter(diagnostic.a, rendererForA, context)) } } -class DiagnosticWithParameters2Renderer( +class DiagnosticWithParameters2Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, private val rendererForB: DiagnosticParameterRenderer? ) : AbstractDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: DiagnosticWithParameters2<*, A, B>): Array { + override fun renderParameters(diagnostic: DiagnosticWithParameters2<*, A, B>): Array { val context = RenderingContext.of(diagnostic.a, diagnostic.b) return arrayOf( renderParameter(diagnostic.a, rendererForA, context), @@ -58,14 +58,14 @@ class DiagnosticWithParameters2Renderer( } } -class DiagnosticWithParameters3Renderer( +class DiagnosticWithParameters3Renderer( message: String, private val rendererForA: DiagnosticParameterRenderer?, private val rendererForB: DiagnosticParameterRenderer?, private val rendererForC: DiagnosticParameterRenderer? ) : AbstractDiagnosticWithParametersRenderer>(message) { - override fun renderParameters(diagnostic: DiagnosticWithParameters3<*, A, B, C>): Array { + override fun renderParameters(diagnostic: DiagnosticWithParameters3<*, A, B, C>): Array { val context = RenderingContext.of(diagnostic.a, diagnostic.b, diagnostic.c) return arrayOf( renderParameter(diagnostic.a, rendererForA, context), diff --git a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/codeMetaInfo/renderConfigurations/DiagnosticCodeMetaInfoRenderConfiguration.kt b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/codeMetaInfo/renderConfigurations/DiagnosticCodeMetaInfoRenderConfiguration.kt index 57b366af3e8..1196dec4749 100644 --- a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/codeMetaInfo/renderConfigurations/DiagnosticCodeMetaInfoRenderConfiguration.kt +++ b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/codeMetaInfo/renderConfigurations/DiagnosticCodeMetaInfoRenderConfiguration.kt @@ -38,7 +38,7 @@ open class DiagnosticCodeMetaInfoRenderConfiguration( else -> DefaultErrorMessages.getRendererForDiagnostic(codeMetaInfo.diagnostic) } if (renderer is AbstractDiagnosticWithParametersRenderer) { - renderer.renderParameters(codeMetaInfo.diagnostic).mapTo(params, Any::toString) + renderer.renderParameters(codeMetaInfo.diagnostic).mapTo(params, Any?::toString) } if (renderSeverity) params.add("severity='${codeMetaInfo.diagnostic.severity}'") diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostics/FirIdeDiagnosticReporter.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostics/FirIdeDiagnosticReporter.kt index 5e006d29b4b..41b62bf311d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostics/FirIdeDiagnosticReporter.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostics/FirIdeDiagnosticReporter.kt @@ -41,28 +41,28 @@ private fun FirLightDiagnostic.toPsiDiagnostic(): FirPsiDiagnostic<*> { psiSourceElement, a, severity, - factory as FirDiagnosticFactory1 + factory as FirDiagnosticFactory1 ) is FirLightDiagnosticWithParameters2<*, *> -> FirPsiDiagnosticWithParameters2( psiSourceElement, a, b, severity, - factory as FirDiagnosticFactory2 + factory as FirDiagnosticFactory2 ) is FirLightDiagnosticWithParameters3<*, *, *> -> FirPsiDiagnosticWithParameters3( psiSourceElement, a, b, c, severity, - factory as FirDiagnosticFactory3 + factory as FirDiagnosticFactory3 ) is FirLightDiagnosticWithParameters4<*, *, *, *> -> FirPsiDiagnosticWithParameters4( psiSourceElement, a, b, c, d, severity, - factory as FirDiagnosticFactory4 + factory as FirDiagnosticFactory4 ) else -> error("Unknown diagnostic type ${this::class.simpleName}") } diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index 5b2ad83e52f..bfed3fbcd3f 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -73,16 +73,21 @@ object HLDiagnosticConverter { private object FirToKtConversionCreator { fun createConversion(type: KType): HLParameterConversion { + val nullable = type.isMarkedNullable val kClass = type.classifier as KClass<*> return tryMapAllowedType(kClass) ?: tryMapPsiElementType(type, kClass) - ?: tryMapFirTypeToKtType(kClass) + ?: tryMapFirTypeToKtType(kClass, nullable) ?: tryMapPlatformType(type, kClass) ?: error("Unsupported type $type, consider add corresponding mapping") } - private fun tryMapFirTypeToKtType(kClass: KClass<*>): HLParameterConversion? { - return typeMapping[kClass] + private fun tryMapFirTypeToKtType(kClass: KClass<*>, nullable: Boolean): HLParameterConversion? { + return if (nullable) { + nullableTypeMapping[kClass] ?: typeMapping[kClass] + } else { + typeMapping[kClass] + } } private fun tryMapAllowedType(kClass: KClass<*>): HLParameterConversion? { @@ -116,6 +121,17 @@ private object FirToKtConversionCreator { return null } + private val nullableTypeMapping: Map, HLFunctionCallConversion> = mapOf( + FirExpression::class to HLFunctionCallConversion( + "{0}?.source?.psi as? KtExpression", + KtExpression::class.createType(nullable = true), + importsToAdd = listOf( + "org.jetbrains.kotlin.psi.KtExpression", + "org.jetbrains.kotlin.fir.psi" + ) + ), + ) + private val typeMapping: Map, HLFunctionCallConversion> = mapOf( AbstractFirBasedSymbol::class to HLFunctionCallConversion( "firSymbolBuilder.buildSymbol({0}.fir as FirDeclaration)", diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/generatorUtils.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/generatorUtils.kt index aff7a760e49..0de1bab2c52 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/generatorUtils.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/generatorUtils.kt @@ -11,13 +11,14 @@ import kotlin.reflect.KType internal fun SmartPrinter.printTypeWithShortNames(type: KType) { fun typeConversion(type: KType): String { + val nullableSuffix = if (type.isMarkedNullable) "?" else "" val simpleName = (type.classifier as KClass<*>).simpleName!! - return if (type.arguments.isEmpty()) simpleName + return if (type.arguments.isEmpty()) simpleName + nullableSuffix else simpleName + type.arguments.joinToString(separator = ", ", prefix = "<", postfix = ">") { when (val typeArgument = it.type) { null -> "*" else -> typeConversion(typeArgument) - } + } + nullableSuffix } } print(typeConversion(type)) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtDiagnosticConverter.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtDiagnosticConverter.kt index 476802d01c5..8cb7917b176 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtDiagnosticConverter.kt @@ -15,19 +15,19 @@ internal fun interface KtFirDiagnostic0Creator : KtFirDiagnosticCreator { fun KtFirAnalysisSession.create(diagnostic: FirSimpleDiagnostic<*>): KtFirDiagnostic<*> } -internal fun interface KtFirDiagnostic1Creator : KtFirDiagnosticCreator { +internal fun interface KtFirDiagnostic1Creator : KtFirDiagnosticCreator { fun KtFirAnalysisSession.create(diagnostic: FirDiagnosticWithParameters1<*, A>): KtFirDiagnostic<*> } -internal fun interface KtFirDiagnostic2Creator : KtFirDiagnosticCreator { +internal fun interface KtFirDiagnostic2Creator : KtFirDiagnosticCreator { fun KtFirAnalysisSession.create(diagnostic: FirDiagnosticWithParameters2<*, A, B>): KtFirDiagnostic<*> } -internal fun interface KtFirDiagnostic3Creator : KtFirDiagnosticCreator { +internal fun interface KtFirDiagnostic3Creator : KtFirDiagnosticCreator { fun KtFirAnalysisSession.create(diagnostic: FirDiagnosticWithParameters3<*, A, B, C>): KtFirDiagnostic<*> } -internal fun interface KtFirDiagnostic4Creator : KtFirDiagnosticCreator { +internal fun interface KtFirDiagnostic4Creator : KtFirDiagnosticCreator { fun KtFirAnalysisSession.create(diagnostic: FirDiagnosticWithParameters4<*, A, B, C, D>): KtFirDiagnostic<*> } @@ -42,17 +42,17 @@ internal class KtDiagnosticConverter(private val conversions: Map with(creator) { create(diagnostic as FirSimpleDiagnostic<*>) } - is KtFirDiagnostic1Creator<*> -> with(creator as KtFirDiagnostic1Creator) { - create(diagnostic as FirDiagnosticWithParameters1) + is KtFirDiagnostic1Creator<*> -> with(creator as KtFirDiagnostic1Creator) { + create(diagnostic as FirDiagnosticWithParameters1) } - is KtFirDiagnostic2Creator<*, *> -> with(creator as KtFirDiagnostic2Creator) { - create(diagnostic as FirDiagnosticWithParameters2) + is KtFirDiagnostic2Creator<*, *> -> with(creator as KtFirDiagnostic2Creator) { + create(diagnostic as FirDiagnosticWithParameters2) } - is KtFirDiagnostic3Creator<*, *, *> -> with(creator as KtFirDiagnostic3Creator) { - create(diagnostic as FirDiagnosticWithParameters3) + is KtFirDiagnostic3Creator<*, *, *> -> with(creator as KtFirDiagnostic3Creator) { + create(diagnostic as FirDiagnosticWithParameters3) } - is KtFirDiagnostic4Creator<*, *, *, *> -> with(creator as KtFirDiagnostic4Creator) { - create(diagnostic as FirDiagnosticWithParameters4) + is KtFirDiagnostic4Creator<*, *, *, *> -> with(creator as KtFirDiagnostic4Creator) { + create(diagnostic as FirDiagnosticWithParameters4) } else -> error("Invalid KtFirDiagnosticCreator ${creator::class.simpleName}") } @@ -67,19 +67,19 @@ internal class KtDiagnosticConverterBuilder private constructor() { conversions[diagnostic] = creator } - fun add(diagnostic: FirDiagnosticFactory1<*, A>, creator: KtFirDiagnostic1Creator) { + fun add(diagnostic: FirDiagnosticFactory1<*, A>, creator: KtFirDiagnostic1Creator) { conversions[diagnostic] = creator } - fun add(diagnostic: FirDiagnosticFactory2<*, A, B>, creator: KtFirDiagnostic2Creator) { + fun add(diagnostic: FirDiagnosticFactory2<*, A, B>, creator: KtFirDiagnostic2Creator) { conversions[diagnostic] = creator } - fun add(diagnostic: FirDiagnosticFactory3<*, A, B, C>, creator: KtFirDiagnostic3Creator) { + fun add(diagnostic: FirDiagnosticFactory3<*, A, B, C>, creator: KtFirDiagnostic3Creator) { conversions[diagnostic] = creator } - fun add(diagnostic: FirDiagnosticFactory4<*, A, B, C, D>, creator: KtFirDiagnostic4Creator) { + fun add(diagnostic: FirDiagnosticFactory4<*, A, B, C, D>, creator: KtFirDiagnostic4Creator) { conversions[diagnostic] = creator }