From ecbf9cd4d51f0b473da3c0d84f88c5e472d3ae90 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 9 May 2022 21:50:53 +0200 Subject: [PATCH] [analysis api] fix ISE: No conversion was found for SYNTAX ^KT-51786 fixed --- .../fir/generator/DiagnosticClassGenerator.kt | 6 +-- .../kotlin/analysis/api/fir/generator/Main.kt | 5 ++- .../AbstractDiagnosticsDataClassRenderer.kt | 2 +- .../diagnostics/KtFirDataClassConverters.kt | 6 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 +++ .../kotlin/fir/checkers/generator/Main.kt | 8 +++- .../diagnostics/FirSyntaxDiagnosticList.kt | 18 +++++++++ .../model/DiagnosticListGenerator.kt | 5 ++- .../model/DiagnosticListRenderer.kt | 7 +++- .../model/ErrorListDiagnosticListRenderer.kt | 40 ++++++++++++------- .../raw-fir/raw-fir.common/build.gradle.kts | 5 ++- .../kotlin/fir/builder/FirSyntaxErrors.kt | 24 +++++++++++ ...s.kt => FirSyntaxErrorsDefaultMessages.kt} | 13 ------ 14 files changed, 110 insertions(+), 38 deletions(-) create mode 100644 compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt create mode 100644 compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt rename compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/{FirSyntaxErrors.kt => FirSyntaxErrorsDefaultMessages.kt} (65%) diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt index b7dd2c05f34..3637a6041f9 100644 --- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt +++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/DiagnosticClassGenerator.kt @@ -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()) } } diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt index 570770c6a8e..25449f2c256 100644 --- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt +++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/Main.kt @@ -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) } diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt index 55b0e15c2cb..3baf365320c 100644 --- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt +++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/rendererrs/AbstractDiagnosticsDataClassRenderer.kt @@ -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) { val hlDiagnosticsList = HLDiagnosticConverter.convert(diagnosticList) file.writeToFileUsingSmartPrinterIfFileContentChanged { render(hlDiagnosticsList, packageName) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 20b4ad0d59d..2626bed7c6c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4441,4 +4441,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirSyntaxErrors.SYNTAX) { firDiagnostic -> + SyntaxImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 8e176b12b43..e2d01de278e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3088,4 +3088,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = JavaSamInterfaceConstructorReference::class } + abstract class Syntax : KtFirDiagnostic() { + override val diagnosticClass get() = Syntax::class + } + } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 969385c8c52..4617105899a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3734,3 +3734,8 @@ internal class JavaSamInterfaceConstructorReferenceImpl( override val token: ValidityToken, ) : KtFirDiagnostic.JavaSamInterfaceConstructorReference(), KtAbstractFirDiagnostic +internal class SyntaxImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.Syntax(), KtAbstractFirDiagnostic + diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt index 4dfe2568951..8b96f34f122 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt @@ -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) { val arguments = args.toList() @@ -93,9 +95,11 @@ fun main(args: Array) { } 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)) } /* diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt new file mode 100644 index 00000000000..d14c4ae64f2 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirSyntaxDiagnosticList.kt @@ -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() + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListGenerator.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListGenerator.kt index e0fe19c3516..008a760fb93 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListGenerator.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListGenerator.kt @@ -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) { val generationPath = getGenerationPath(rootPath, packageName) ErrorListDiagnosticListRenderer.render( generationPath.resolve("${diagnosticList.objectName}.kt"), diagnosticList, - packageName + packageName, + starImportsToAdd, ) } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListRenderer.kt index df2c4a73a96..1eb09ad8030 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListRenderer.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/DiagnosticListRenderer.kt @@ -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, + ) } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/ErrorListDiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/ErrorListDiagnosticListRenderer.kt index 06868e61d0e..ad4d57c07e7 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/ErrorListDiagnosticListRenderer.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/ErrorListDiagnosticListRenderer.kt @@ -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 + ) { 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, + ) { 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) { + val imports = collectImports(diagnosticList, packageName, starImportsToAdd) printImports(imports) println() } @OptIn(ExperimentalStdlibApi::class) - private fun collectImports(diagnosticList: DiagnosticList, packageName: String): Collection = buildSet { - if (packageName != BASE_PACKAGE) { - add("$BASE_PACKAGE.*") - } - if (packageName != DIAGNOSTICS_PACKAGE) { - add("$DIAGNOSTICS_PACKAGE.*") + private fun collectImports( + diagnosticList: DiagnosticList, + packageName: String, + starImportsToAdd: Set + ): Collection = buildSet { + for (starImport in starImportsToAdd) { + if (starImport != packageName) { + add("$starImport.*") + } } diagnosticList.allDiagnostics.forEach { diagnostic -> for (typeArgument in diagnostic.getAllTypeArguments()) { diff --git a/compiler/fir/raw-fir/raw-fir.common/build.gradle.kts b/compiler/fir/raw-fir/raw-fir.common/build.gradle.kts index 03583a5ecaf..9f45cbe631b 100644 --- a/compiler/fir/raw-fir/raw-fir.common/build.gradle.kts +++ b/compiler/fir/raw-fir/raw-fir.common/build.gradle.kts @@ -22,7 +22,10 @@ dependencies { } sourceSets { - "main" { projectDefault() } + "main" { + projectDefault() + java.srcDir("gen") + } "test" { none() } } diff --git a/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt b/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt new file mode 100644 index 00000000000..3b703b80612 --- /dev/null +++ b/compiler/fir/raw-fir/raw-fir.common/gen/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt @@ -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() + + init { + RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages) + } +} diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt similarity index 65% rename from compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt rename to compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt index 87c63469697..5c813e0ded0 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrors.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/FirSyntaxErrorsDefaultMessages.kt @@ -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() - - init { - RootDiagnosticRendererFactory.registerFactory(FirSyntaxErrorsDefaultMessages) - } -} @Suppress("unused") object FirSyntaxErrorsDefaultMessages : BaseDiagnosticRendererFactory() { - override val MAP = KtDiagnosticFactoryToRendererMap("FIR").also { map -> map.put(FirSyntaxErrors.SYNTAX, "Syntax error") }