[analysis api] fix ISE: No conversion was found for SYNTAX

^KT-51786 fixed
This commit is contained in:
Ilya Kirillov
2022-05-09 21:50:53 +02:00
parent 6e0eba7e00
commit ecbf9cd4d5
14 changed files with 110 additions and 38 deletions
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.FirTypeRef
import java.io.File
import org.jetbrains.kotlin.fir.builder.SYNTAX_DIAGNOSTIC_LIST
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.ErrorListDiagnosticListRenderer
fun main(args: Array<String>) {
val arguments = args.toList()
@@ -93,9 +95,11 @@ fun main(args: Array<String>) {
}
val jvmGenerationPath = File(arguments.getOrElse(1) { "compiler/fir/checkers/checkers.jvm/gen" })
val rawFirGenerationPath = File("compiler/fir/raw-fir/raw-fir.common/gen")
generateDiagnostics(generationPath, "$basePackage.diagnostics", DIAGNOSTICS_LIST)
generateDiagnostics(jvmGenerationPath, "$basePackage.diagnostics.jvm", JVM_DIAGNOSTICS_LIST)
generateDiagnostics(generationPath, "$basePackage.diagnostics", DIAGNOSTICS_LIST, starImportsToAdd = setOf(ErrorListDiagnosticListRenderer.BASE_PACKAGE, ErrorListDiagnosticListRenderer.DIAGNOSTICS_PACKAGE))
generateDiagnostics(jvmGenerationPath, "$basePackage.diagnostics.jvm", JVM_DIAGNOSTICS_LIST, starImportsToAdd = setOf(ErrorListDiagnosticListRenderer.BASE_PACKAGE, ErrorListDiagnosticListRenderer.DIAGNOSTICS_PACKAGE))
generateDiagnostics(rawFirGenerationPath, "org.jetbrains.kotlin.fir.builder", SYNTAX_DIAGNOSTIC_LIST, starImportsToAdd = setOf(ErrorListDiagnosticListRenderer.DIAGNOSTICS_PACKAGE))
}
/*
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.builder
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
@OptIn(PrivateForInline::class)
object SYNTAX_DIAGNOSTIC_LIST : DiagnosticList("FirSyntaxErrors") {
val Syntax by object : DiagnosticGroup("Syntax") {
val SYNTAX by error<PsiElement>()
}
}
@@ -8,11 +8,12 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model
import org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath
import java.io.File
fun generateDiagnostics(rootPath: File, packageName: String, diagnosticList: DiagnosticList) {
fun generateDiagnostics(rootPath: File, packageName: String, diagnosticList: DiagnosticList, starImportsToAdd: Set<String>) {
val generationPath = getGenerationPath(rootPath, packageName)
ErrorListDiagnosticListRenderer.render(
generationPath.resolve("${diagnosticList.objectName}.kt"),
diagnosticList,
packageName
packageName,
starImportsToAdd,
)
}
@@ -8,5 +8,10 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model
import java.io.File
abstract class DiagnosticListRenderer {
abstract fun render(file: File, diagnosticList: DiagnosticList, packageName: String)
abstract fun render(
file: File,
diagnosticList: DiagnosticList,
packageName: String,
starImportsToAdd: Set<String>,
)
}
@@ -18,20 +18,29 @@ import kotlin.reflect.KType
import kotlin.reflect.KTypeProjection
object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
private const val BASE_PACKAGE = "org.jetbrains.kotlin.fir.analysis.diagnostics"
private const val DIAGNOSTICS_PACKAGE = "org.jetbrains.kotlin.diagnostics"
const val BASE_PACKAGE = "org.jetbrains.kotlin.fir.analysis.diagnostics"
const val DIAGNOSTICS_PACKAGE = "org.jetbrains.kotlin.diagnostics"
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) {
override fun render(
file: File,
diagnosticList: DiagnosticList,
packageName: String,
starImportsToAdd: Set<String>
) {
file.writeToFileUsingSmartPrinterIfFileContentChanged {
render(diagnosticList, packageName)
render(diagnosticList, packageName, starImportsToAdd)
}
}
private fun SmartPrinter.render(diagnosticList: DiagnosticList, packageName: String) {
private fun SmartPrinter.render(
diagnosticList: DiagnosticList,
packageName: String,
starImportsToAdd: Set<String>,
) {
printCopyright()
println("package $packageName")
println()
collectAndPrintImports(diagnosticList, packageName)
collectAndPrintImports(diagnosticList, packageName, starImportsToAdd)
printGeneratedMessage()
printErrorsObject(diagnosticList)
}
@@ -116,19 +125,22 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
}
}
private fun SmartPrinter.collectAndPrintImports(diagnosticList: DiagnosticList, packageName: String) {
val imports = collectImports(diagnosticList, packageName)
private fun SmartPrinter.collectAndPrintImports(diagnosticList: DiagnosticList, packageName: String, starImportsToAdd: Set<String>) {
val imports = collectImports(diagnosticList, packageName, starImportsToAdd)
printImports(imports)
println()
}
@OptIn(ExperimentalStdlibApi::class)
private fun collectImports(diagnosticList: DiagnosticList, packageName: String): Collection<String> = buildSet {
if (packageName != BASE_PACKAGE) {
add("$BASE_PACKAGE.*")
}
if (packageName != DIAGNOSTICS_PACKAGE) {
add("$DIAGNOSTICS_PACKAGE.*")
private fun collectImports(
diagnosticList: DiagnosticList,
packageName: String,
starImportsToAdd: Set<String>
): Collection<String> = buildSet {
for (starImport in starImportsToAdd) {
if (starImport != packageName) {
add("$starImport.*")
}
}
diagnosticList.allDiagnostics.forEach { diagnostic ->
for (typeArgument in diagnostic.getAllTypeArguments()) {
@@ -22,7 +22,10 @@ dependencies {
}
sourceSets {
"main" { projectDefault() }
"main" {
projectDefault()
java.srcDir("gen")
}
"test" { none() }
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.builder
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.*
import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
object FirSyntaxErrors {
// Syntax
val SYNTAX by error0<PsiElement>()
init {
RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages)
}
}
@@ -5,24 +5,11 @@
package org.jetbrains.kotlin.fir.builder
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap
import org.jetbrains.kotlin.diagnostics.error0
import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory
import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory
object FirSyntaxErrors {
val SYNTAX by error0<PsiElement>()
init {
RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages)
}
}
@Suppress("unused")
object FirSyntaxErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
override val MAP = KtDiagnosticFactoryToRendererMap("FIR").also { map ->
map.put(FirSyntaxErrors.SYNTAX, "Syntax error")
}