[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
@@ -15,8 +15,8 @@ import java.nio.file.Path
object DiagnosticClassGenerator {
fun generate(rootPath: Path, diagnosticList: DiagnosticList, packageName: String) {
val path = getGenerationPath(rootPath.toFile(), packageName)
KtDiagnosticClassRenderer.render(path.resolve("KtFirDiagnostics.kt"), diagnosticList, packageName)
KtDiagnosticClassImplementationRenderer.render(path.resolve("KtFirDiagnosticsImpl.kt"), diagnosticList, packageName)
FirDiagnosticToKtDiagnosticConverterRenderer.render(path.resolve("KtFirDataClassConverters.kt"), diagnosticList, packageName)
KtDiagnosticClassRenderer.render(path.resolve("KtFirDiagnostics.kt"), diagnosticList, packageName, emptySet())
KtDiagnosticClassImplementationRenderer.render(path.resolve("KtFirDiagnosticsImpl.kt"), diagnosticList, packageName, emptySet())
FirDiagnosticToKtDiagnosticConverterRenderer.render(path.resolve("KtFirDataClassConverters.kt"), diagnosticList, packageName, emptySet())
}
}
@@ -8,9 +8,12 @@ package org.jetbrains.kotlin.analysis.api.fir.generator
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DIAGNOSTICS_LIST
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.JVM_DIAGNOSTICS_LIST
import java.nio.file.Paths
import org.jetbrains.kotlin.analysis.api.fir.generator.DiagnosticClassGenerator.generate
import org.jetbrains.kotlin.fir.builder.SYNTAX_DIAGNOSTIC_LIST
fun main() {
val rootPath = Paths.get("analysis/analysis-api-fir/src").toAbsolutePath()
val packageName = "org.jetbrains.kotlin.analysis.api.fir.diagnostics"
DiagnosticClassGenerator.generate(rootPath, DIAGNOSTICS_LIST + JVM_DIAGNOSTICS_LIST, packageName)
val diagnostics = DIAGNOSTICS_LIST + JVM_DIAGNOSTICS_LIST + SYNTAX_DIAGNOSTIC_LIST
generate(rootPath, diagnostics, packageName)
}
@@ -21,7 +21,7 @@ import java.io.File
import kotlin.reflect.KType
abstract class AbstractDiagnosticsDataClassRenderer : DiagnosticListRenderer() {
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) {
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String, starImportsToAdd: Set<String>) {
val hlDiagnosticsList = HLDiagnosticConverter.convert(diagnosticList)
file.writeToFileUsingSmartPrinterIfFileContentChanged { render(hlDiagnosticsList, packageName) }
}
@@ -4441,4 +4441,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirSyntaxErrors.SYNTAX) { firDiagnostic ->
SyntaxImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
}
@@ -3088,4 +3088,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = JavaSamInterfaceConstructorReference::class
}
abstract class Syntax : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = Syntax::class
}
}
@@ -3734,3 +3734,8 @@ internal class JavaSamInterfaceConstructorReferenceImpl(
override val token: ValidityToken,
) : KtFirDiagnostic.JavaSamInterfaceConstructorReference(), KtAbstractFirDiagnostic<PsiElement>
internal class SyntaxImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.Syntax(), KtAbstractFirDiagnostic<PsiElement>
@@ -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")
}