[FIR-IDE] Avoid clashes between diagnostic and it's parameter with same short names

This commit is contained in:
Dmitriy Novozhilov
2021-08-30 10:43:55 +03:00
parent 88913aa2a3
commit 5d31f0f032
6 changed files with 36 additions and 16 deletions
@@ -9,10 +9,14 @@ import org.jetbrains.kotlin.util.SmartPrinter
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KType 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 { fun typeConversion(type: KType): String {
val nullableSuffix = if (type.isMarkedNullable) "?" else "" 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 return if (type.arguments.isEmpty()) simpleName + nullableSuffix
else simpleName + type.arguments.joinToString(separator = ", ", prefix = "<", postfix = ">") { else simpleName + type.arguments.joinToString(separator = ", ", prefix = "<", postfix = ">") {
when (val typeArgument = it.type) { when (val typeArgument = it.type) {
@@ -23,3 +27,9 @@ internal fun SmartPrinter.printTypeWithShortNames(type: KType) {
} }
print(typeConversion(type)) print(typeConversion(type))
} }
val KType.simpleName: String
get() = (classifier as KClass<*>).simpleName!!
val KType.qualifiedName: String
get() = (classifier as KClass<*>).qualifiedName!!
@@ -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.HLDiagnosticConverter
import org.jetbrains.kotlin.idea.frontend.api.fir.generator.HLDiagnosticList 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.HLDiagnosticParameter
import org.jetbrains.kotlin.idea.frontend.api.fir.generator.simpleName
import org.jetbrains.kotlin.util.SmartPrinter import org.jetbrains.kotlin.util.SmartPrinter
import java.io.File import java.io.File
import kotlin.reflect.KType
abstract class AbstractDiagnosticsDataClassRenderer : DiagnosticListRenderer() { abstract class AbstractDiagnosticsDataClassRenderer : DiagnosticListRenderer() {
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) { 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<String> protected abstract fun collectImportsForDiagnosticParameter(diagnosticParameter: HLDiagnosticParameter): Collection<String>
protected abstract fun SmartPrinter.render(diagnosticList: HLDiagnosticList, packageName: String) protected abstract fun SmartPrinter.render(diagnosticList: HLDiagnosticList, packageName: String)
@@ -22,15 +22,15 @@ object KtDiagnosticClassImplementationRenderer : AbstractDiagnosticsDataClassRen
private fun SmartPrinter.printDiagnosticClassesImplementation(diagnosticList: HLDiagnosticList) { private fun SmartPrinter.printDiagnosticClassesImplementation(diagnosticList: HLDiagnosticList) {
for (diagnostic in diagnosticList.diagnostics) { for (diagnostic in diagnosticList.diagnostics) {
printDiagnosticImplementation(diagnostic) printDiagnosticImplementation(diagnostic, diagnosticList)
println() println()
} }
} }
private fun SmartPrinter.printDiagnosticImplementation(diagnostic: HLDiagnostic) { private fun SmartPrinter.printDiagnosticImplementation(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) {
println("internal class ${diagnostic.implClassName}(") println("internal class ${diagnostic.implClassName}(")
withIndent { withIndent {
printParameters(diagnostic) printParameters(diagnostic, diagnosticList)
} }
print(") : KtFirDiagnostic.${diagnostic.className}(), KtAbstractFirDiagnostic<") print(") : KtFirDiagnostic.${diagnostic.className}(), KtAbstractFirDiagnostic<")
printTypeWithShortNames(diagnostic.original.psiType) 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) { for (parameter in diagnostic.parameters) {
printParameter(parameter) printParameter(parameter, diagnosticList)
} }
println("firDiagnostic: FirPsiDiagnostic,") println("firDiagnostic: FirPsiDiagnostic,")
println("override val token: ValidityToken,") println("override val token: ValidityToken,")
} }
private fun SmartPrinter.printParameter(parameter: HLDiagnosticParameter) { private fun SmartPrinter.printParameter(parameter: HLDiagnosticParameter, diagnosticList: HLDiagnosticList) {
print("override val ${parameter.name}: ") print("override val ${parameter.name}: ")
printTypeWithShortNames(parameter.type) printTypeWithShortNames(parameter.type) {
diagnosticList.containsClashingBySimpleNameType(it)
}
println(",") println(",")
} }
@@ -20,26 +20,28 @@ object KtDiagnosticClassRenderer : AbstractDiagnosticsDataClassRenderer() {
private fun SmartPrinter.printDiagnosticClasses(diagnosticList: HLDiagnosticList) { private fun SmartPrinter.printDiagnosticClasses(diagnosticList: HLDiagnosticList) {
inBracketsWithIndent("sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI>") { inBracketsWithIndent("sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI>") {
for (diagnostic in diagnosticList.diagnostics) { for (diagnostic in diagnosticList.diagnostics) {
printDiagnosticClass(diagnostic) printDiagnosticClass(diagnostic, diagnosticList)
println() println()
} }
} }
} }
private fun SmartPrinter.printDiagnosticClass(diagnostic: HLDiagnostic) { private fun SmartPrinter.printDiagnosticClass(diagnostic: HLDiagnostic, diagnosticList: HLDiagnosticList) {
print("abstract class ${diagnostic.className} : KtFirDiagnostic<") print("abstract class ${diagnostic.className} : KtFirDiagnostic<")
printTypeWithShortNames(diagnostic.original.psiType) printTypeWithShortNames(diagnostic.original.psiType)
print(">()") print(">()")
inBracketsWithIndent { inBracketsWithIndent {
println("override val diagnosticClass get() = ${diagnostic.className}::class") 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 -> diagnostic.parameters.forEach { parameter ->
print("abstract val ${parameter.name}: ") print("abstract val ${parameter.name}: ")
printTypeWithShortNames(parameter.type) printTypeWithShortNames(parameter.type) { type ->
diagnosticList.containsClashingBySimpleNameType(type)
}
println() println()
} }
} }
@@ -552,7 +552,7 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
abstract class OverrideDeprecation : KtFirDiagnostic<KtNamedDeclaration>() { abstract class OverrideDeprecation : KtFirDiagnostic<KtNamedDeclaration>() {
override val diagnosticClass get() = OverrideDeprecation::class override val diagnosticClass get() = OverrideDeprecation::class
abstract val overridenSymbol: KtSymbol abstract val overridenSymbol: KtSymbol
abstract val deprecationInfo: Deprecation abstract val deprecationInfo: org.jetbrains.kotlin.resolve.deprecation.Deprecation
} }
abstract class AnnotationOnSuperclassError : KtFirDiagnostic<KtAnnotationEntry>() { abstract class AnnotationOnSuperclassError : KtFirDiagnostic<KtAnnotationEntry>() {
@@ -879,7 +879,7 @@ internal class DeprecatedSinceKotlinOutsideKotlinSubpackageImpl(
internal class OverrideDeprecationImpl( internal class OverrideDeprecationImpl(
override val overridenSymbol: KtSymbol, override val overridenSymbol: KtSymbol,
override val deprecationInfo: Deprecation, override val deprecationInfo: org.jetbrains.kotlin.resolve.deprecation.Deprecation,
firDiagnostic: FirPsiDiagnostic, firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken, override val token: ValidityToken,
) : KtFirDiagnostic.OverrideDeprecation(), KtAbstractFirDiagnostic<KtNamedDeclaration> { ) : KtFirDiagnostic.OverrideDeprecation(), KtAbstractFirDiagnostic<KtNamedDeclaration> {