From 5d31f0f032fa0c7ae9a1c276bdc42d92fe264cab Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 30 Aug 2021 10:43:55 +0300 Subject: [PATCH] [FIR-IDE] Avoid clashes between diagnostic and it's parameter with same short names --- .../frontend/api/fir/generator/generatorUtils.kt | 14 ++++++++++++-- .../AbstractDiagnosticsDataClassRenderer.kt | 6 ++++++ .../KtDiagnosticClassImplementationRenderer.kt | 16 +++++++++------- .../rendererrs/KtDiagnosticClassRenderer.kt | 12 +++++++----- .../api/fir/diagnostics/KtFirDiagnostics.kt | 2 +- .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 2 +- 6 files changed, 36 insertions(+), 16 deletions(-) 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 0de1bab2c52..760e7e21923 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 @@ -9,10 +9,14 @@ import org.jetbrains.kotlin.util.SmartPrinter import kotlin.reflect.KClass import kotlin.reflect.KType -internal fun SmartPrinter.printTypeWithShortNames(type: KType) { +internal fun SmartPrinter.printTypeWithShortNames(type: KType, shouldRenderFqName: (KType) -> Boolean = { false }) { fun typeConversion(type: KType): String { val nullableSuffix = if (type.isMarkedNullable) "?" else "" - val simpleName = (type.classifier as KClass<*>).simpleName!! + val simpleName = if (shouldRenderFqName(type)) { + type.qualifiedName + } else { + type.simpleName + } return if (type.arguments.isEmpty()) simpleName + nullableSuffix else simpleName + type.arguments.joinToString(separator = ", ", prefix = "<", postfix = ">") { when (val typeArgument = it.type) { @@ -23,3 +27,9 @@ internal fun SmartPrinter.printTypeWithShortNames(type: KType) { } print(typeConversion(type)) } + +val KType.simpleName: String + get() = (classifier as KClass<*>).simpleName!! + +val KType.qualifiedName: String + get() = (classifier as KClass<*>).qualifiedName!! diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt index 9ab9079d8c0..701a84c67d0 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt @@ -15,8 +15,10 @@ import org.jetbrains.kotlin.fir.tree.generator.util.writeToFileUsingSmartPrinter import org.jetbrains.kotlin.idea.frontend.api.fir.generator.HLDiagnosticConverter import org.jetbrains.kotlin.idea.frontend.api.fir.generator.HLDiagnosticList import org.jetbrains.kotlin.idea.frontend.api.fir.generator.HLDiagnosticParameter +import org.jetbrains.kotlin.idea.frontend.api.fir.generator.simpleName import org.jetbrains.kotlin.util.SmartPrinter import java.io.File +import kotlin.reflect.KType abstract class AbstractDiagnosticsDataClassRenderer : DiagnosticListRenderer() { override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) { @@ -49,6 +51,10 @@ abstract class AbstractDiagnosticsDataClassRenderer : DiagnosticListRenderer() { } } + protected fun HLDiagnosticList.containsClashingBySimpleNameType(type: KType): Boolean { + return diagnostics.any { it.className == type.simpleName } + } + protected abstract fun collectImportsForDiagnosticParameter(diagnosticParameter: HLDiagnosticParameter): Collection protected abstract fun SmartPrinter.render(diagnosticList: HLDiagnosticList, packageName: String) diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassImplementationRenderer.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassImplementationRenderer.kt index 9d67b7920ee..2eda565d694 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassImplementationRenderer.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassImplementationRenderer.kt @@ -22,15 +22,15 @@ object KtDiagnosticClassImplementationRenderer : AbstractDiagnosticsDataClassRen private fun SmartPrinter.printDiagnosticClassesImplementation(diagnosticList: HLDiagnosticList) { for (diagnostic in diagnosticList.diagnostics) { - printDiagnosticImplementation(diagnostic) + printDiagnosticImplementation(diagnostic, diagnosticList) println() } } - private fun SmartPrinter.printDiagnosticImplementation(diagnostic: HLDiagnostic) { + private fun SmartPrinter.printDiagnosticImplementation(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) { println("internal class ${diagnostic.implClassName}(") withIndent { - printParameters(diagnostic) + printParameters(diagnostic, diagnosticList) } print(") : KtFirDiagnostic.${diagnostic.className}(), KtAbstractFirDiagnostic<") printTypeWithShortNames(diagnostic.original.psiType) @@ -40,17 +40,19 @@ object KtDiagnosticClassImplementationRenderer : AbstractDiagnosticsDataClassRen } } - private fun SmartPrinter.printParameters(diagnostic: HLDiagnostic) { + private fun SmartPrinter.printParameters(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) { for (parameter in diagnostic.parameters) { - printParameter(parameter) + printParameter(parameter, diagnosticList) } println("firDiagnostic: FirPsiDiagnostic,") println("override val token: ValidityToken,") } - private fun SmartPrinter.printParameter(parameter: HLDiagnosticParameter) { + private fun SmartPrinter.printParameter(parameter: HLDiagnosticParameter, diagnosticList: HLDiagnosticList) { print("override val ${parameter.name}: ") - printTypeWithShortNames(parameter.type) + printTypeWithShortNames(parameter.type) { + diagnosticList.containsClashingBySimpleNameType(it) + } println(",") } diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassRenderer.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassRenderer.kt index cf730c79520..53f3da0c97c 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassRenderer.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/rendererrs/KtDiagnosticClassRenderer.kt @@ -20,26 +20,28 @@ object KtDiagnosticClassRenderer : AbstractDiagnosticsDataClassRenderer() { private fun SmartPrinter.printDiagnosticClasses(diagnosticList: HLDiagnosticList) { inBracketsWithIndent("sealed class KtFirDiagnostic : KtDiagnosticWithPsi") { for (diagnostic in diagnosticList.diagnostics) { - printDiagnosticClass(diagnostic) + printDiagnosticClass(diagnostic, diagnosticList) println() } } } - private fun SmartPrinter.printDiagnosticClass(diagnostic: HLDiagnostic) { + private fun SmartPrinter.printDiagnosticClass(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) { print("abstract class ${diagnostic.className} : KtFirDiagnostic<") printTypeWithShortNames(diagnostic.original.psiType) print(">()") inBracketsWithIndent { println("override val diagnosticClass get() = ${diagnostic.className}::class") - printDiagnosticParameters(diagnostic) + printDiagnosticParameters(diagnostic, diagnosticList) } } - private fun SmartPrinter.printDiagnosticParameters(diagnostic: HLDiagnostic) { + private fun SmartPrinter.printDiagnosticParameters(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) { diagnostic.parameters.forEach { parameter -> print("abstract val ${parameter.name}: ") - printTypeWithShortNames(parameter.type) + printTypeWithShortNames(parameter.type) { type -> + diagnosticList.containsClashingBySimpleNameType(type) + } println() } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 214ea92fc15..b241ff49745 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -552,7 +552,7 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract class OverrideDeprecation : KtFirDiagnostic() { override val diagnosticClass get() = OverrideDeprecation::class abstract val overridenSymbol: KtSymbol - abstract val deprecationInfo: Deprecation + abstract val deprecationInfo: org.jetbrains.kotlin.resolve.deprecation.Deprecation } abstract class AnnotationOnSuperclassError : KtFirDiagnostic() { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 033e50fbdaa..52b1bedf6e5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -879,7 +879,7 @@ internal class DeprecatedSinceKotlinOutsideKotlinSubpackageImpl( internal class OverrideDeprecationImpl( override val overridenSymbol: KtSymbol, - override val deprecationInfo: Deprecation, + override val deprecationInfo: org.jetbrains.kotlin.resolve.deprecation.Deprecation, firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken, ) : KtFirDiagnostic.OverrideDeprecation(), KtAbstractFirDiagnostic {