[FIR] Add separate diagnostic list for JVM specific diagnostics
This commit is contained in:
committed by
teamcityserver
parent
7f18d147c1
commit
f3c58a1df7
@@ -35,6 +35,11 @@ dependencies {
|
|||||||
|
|
||||||
val generationRoot = projectDir.resolve("gen")
|
val generationRoot = projectDir.resolve("gen")
|
||||||
|
|
||||||
|
// Add modules for js and native checkers here
|
||||||
|
val platformGenerationRoots = listOf(
|
||||||
|
"checkers.jvm"
|
||||||
|
).map { projectDir.resolve(it).resolve("gen") }
|
||||||
|
|
||||||
val generateCheckersComponents by tasks.registering(NoDebugJavaExec::class) {
|
val generateCheckersComponents by tasks.registering(NoDebugJavaExec::class) {
|
||||||
|
|
||||||
val generatorRoot = "$projectDir/checkers-component-generator/src/"
|
val generatorRoot = "$projectDir/checkers-component-generator/src/"
|
||||||
@@ -44,9 +49,9 @@ val generateCheckersComponents by tasks.registering(NoDebugJavaExec::class) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inputs.files(generatorConfigurationFiles)
|
inputs.files(generatorConfigurationFiles)
|
||||||
outputs.dirs(generationRoot)
|
outputs.dirs(generationRoot, *platformGenerationRoots.toTypedArray())
|
||||||
|
|
||||||
args(generationRoot)
|
args(generationRoot, *platformGenerationRoots.toTypedArray())
|
||||||
workingDir = rootDir
|
workingDir = rootDir
|
||||||
classpath = generatorClasspath
|
classpath = generatorClasspath
|
||||||
main = "org.jetbrains.kotlin.fir.checkers.generator.MainKt"
|
main = "org.jetbrains.kotlin.fir.checkers.generator.MainKt"
|
||||||
|
|||||||
+14
-8
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.checkers.generator
|
package org.jetbrains.kotlin.fir.checkers.generator
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DIAGNOSTICS_LIST
|
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DIAGNOSTICS_LIST
|
||||||
|
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.FIR_JVM_DIAGNOSTICS_LIST
|
||||||
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.generateDiagnostics
|
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.generateDiagnostics
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
@@ -13,14 +14,17 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
val generationPath = args.firstOrNull()?.let { File(it) } ?: File("compiler/fir/checkers/gen").absoluteFile
|
val arguments = args.toList()
|
||||||
|
val generationPath = arguments.firstOrNull()?.let { File(it) } ?: File("compiler/fir/checkers/gen").absoluteFile
|
||||||
|
|
||||||
val typePackage = "org.jetbrains.kotlin.fir.analysis.checkers.type"
|
val basePackage = "org.jetbrains.kotlin.fir.analysis"
|
||||||
|
|
||||||
|
val typePackage = "$basePackage.checkers.type"
|
||||||
generateCheckersComponents(generationPath, typePackage, "FirTypeChecker") {
|
generateCheckersComponents(generationPath, typePackage, "FirTypeChecker") {
|
||||||
alias<FirTypeRef>("TypeRefChecker")
|
alias<FirTypeRef>("TypeRefChecker")
|
||||||
}
|
}
|
||||||
|
|
||||||
val expressionPackage = "org.jetbrains.kotlin.fir.analysis.checkers.expression"
|
val expressionPackage = "$basePackage.checkers.expression"
|
||||||
generateCheckersComponents(generationPath, expressionPackage, "FirExpressionChecker") {
|
generateCheckersComponents(generationPath, expressionPackage, "FirExpressionChecker") {
|
||||||
alias<FirStatement>("BasicExpressionChecker")
|
alias<FirStatement>("BasicExpressionChecker")
|
||||||
alias<FirQualifiedAccessExpression>("QualifiedAccessChecker")
|
alias<FirQualifiedAccessExpression>("QualifiedAccessChecker")
|
||||||
@@ -44,7 +48,7 @@ fun main(args: Array<String>) {
|
|||||||
alias<FirResolvedQualifier>("ResolvedQualifierChecker")
|
alias<FirResolvedQualifier>("ResolvedQualifierChecker")
|
||||||
}
|
}
|
||||||
|
|
||||||
val declarationPackage = "org.jetbrains.kotlin.fir.analysis.checkers.declaration"
|
val declarationPackage = "$basePackage.checkers.declaration"
|
||||||
generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") {
|
generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") {
|
||||||
alias<FirDeclaration>("BasicDeclarationChecker")
|
alias<FirDeclaration>("BasicDeclarationChecker")
|
||||||
alias<FirMemberDeclaration>("MemberDeclarationChecker")
|
alias<FirMemberDeclaration>("MemberDeclarationChecker")
|
||||||
@@ -60,17 +64,19 @@ fun main(args: Array<String>) {
|
|||||||
|
|
||||||
additional(
|
additional(
|
||||||
fieldName = "controlFlowAnalyserCheckers",
|
fieldName = "controlFlowAnalyserCheckers",
|
||||||
classFqn = "org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker"
|
classFqn = "$basePackage.checkers.cfa.FirControlFlowChecker"
|
||||||
)
|
)
|
||||||
|
|
||||||
additional(
|
additional(
|
||||||
fieldName = "variableAssignmentCfaBasedCheckers",
|
fieldName = "variableAssignmentCfaBasedCheckers",
|
||||||
classFqn = "org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker"
|
classFqn = "$basePackage.cfa.AbstractFirPropertyInitializationChecker"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val diagnosticsPackage = "org.jetbrains.kotlin.fir.analysis.diagnostics"
|
val jvmGenerationPath = File(arguments.getOrElse(1) { "compiler/fir/checkers/checkers.jvm/gen" })
|
||||||
generateDiagnostics(generationPath, diagnosticsPackage, DIAGNOSTICS_LIST)
|
|
||||||
|
generateDiagnostics(generationPath, "$basePackage.diagnostics", "FirErrors", DIAGNOSTICS_LIST)
|
||||||
|
generateDiagnostics(jvmGenerationPath, "$basePackage.diagnostics.jvm", "FirJvmErrors", FIR_JVM_DIAGNOSTICS_LIST)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+18
@@ -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.checkers.generator.diagnostics
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.PrivateForInline
|
||||||
|
import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.*
|
||||||
|
|
||||||
|
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
object FIR_JVM_DIAGNOSTICS_LIST : DiagnosticList() {
|
||||||
|
val DECLARATIONS by object : DiagnosticGroup("Declarations") {
|
||||||
|
val CONFLICTING_JVM_DECLARATIONS by error<PsiElement>()
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-2
@@ -8,7 +8,12 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model
|
|||||||
import org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath
|
import org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun generateDiagnostics(rootPath: File, packageName: String, diagnosticList: DiagnosticList) {
|
fun generateDiagnostics(rootPath: File, packageName: String, containingObjectName: String, diagnosticList: DiagnosticList) {
|
||||||
val generationPath = getGenerationPath(rootPath, packageName)
|
val generationPath = getGenerationPath(rootPath, packageName)
|
||||||
ErrorListDiagnosticListRenderer.render(generationPath.resolve("FirErrors.kt"), diagnosticList, packageName)
|
ErrorListDiagnosticListRenderer.render(
|
||||||
|
generationPath.resolve("$containingObjectName.kt"),
|
||||||
|
diagnosticList,
|
||||||
|
packageName,
|
||||||
|
containingObjectName
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -8,5 +8,5 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
abstract class DiagnosticListRenderer {
|
abstract class DiagnosticListRenderer {
|
||||||
abstract fun render(file: File, diagnosticList: DiagnosticList, packageName: String)
|
abstract fun render(file: File, diagnosticList: DiagnosticList, packageName: String, containingObjectName: String)
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-10
@@ -16,23 +16,25 @@ import kotlin.reflect.KType
|
|||||||
import kotlin.reflect.KTypeProjection
|
import kotlin.reflect.KTypeProjection
|
||||||
|
|
||||||
object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
|
object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
|
||||||
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) {
|
private const val BASE_PACKAGE = "org.jetbrains.kotlin.fir.analysis.diagnostics"
|
||||||
|
|
||||||
|
override fun render(file: File, diagnosticList: DiagnosticList, packageName: String, containingObjectName: String) {
|
||||||
file.writeToFileUsingSmartPrinterIfFileContentChanged {
|
file.writeToFileUsingSmartPrinterIfFileContentChanged {
|
||||||
render(diagnosticList, packageName)
|
render(diagnosticList, packageName, containingObjectName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SmartPrinter.render(diagnosticList: DiagnosticList, packageName: String) {
|
private fun SmartPrinter.render(diagnosticList: DiagnosticList, packageName: String, containingObjectName: String) {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $packageName")
|
println("package $packageName")
|
||||||
println()
|
println()
|
||||||
collectAndPrintImports(diagnosticList)
|
collectAndPrintImports(diagnosticList, packageName)
|
||||||
printGeneratedMessage()
|
printGeneratedMessage()
|
||||||
printErrorsObject(diagnosticList)
|
printErrorsObject(diagnosticList, containingObjectName)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList) {
|
private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList, containingObjectName: String) {
|
||||||
inBracketsWithIndent("object FirErrors") {
|
inBracketsWithIndent("object $containingObjectName") {
|
||||||
for (group in diagnosticList.groups) {
|
for (group in diagnosticList.groups) {
|
||||||
printDiagnosticGroup(group.name, group.diagnostics)
|
printDiagnosticGroup(group.name, group.diagnostics)
|
||||||
println()
|
println()
|
||||||
@@ -103,14 +105,17 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SmartPrinter.collectAndPrintImports(diagnosticList: DiagnosticList) {
|
private fun SmartPrinter.collectAndPrintImports(diagnosticList: DiagnosticList, packageName: String) {
|
||||||
val imports = collectImports(diagnosticList)
|
val imports = collectImports(diagnosticList, packageName)
|
||||||
printImports(imports)
|
printImports(imports)
|
||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
private fun collectImports(diagnosticList: DiagnosticList): Collection<String> = buildSet {
|
private fun collectImports(diagnosticList: DiagnosticList, packageName: String): Collection<String> = buildSet {
|
||||||
|
if (packageName != BASE_PACKAGE) {
|
||||||
|
add("$BASE_PACKAGE.*")
|
||||||
|
}
|
||||||
diagnosticList.allDiagnostics.forEach { diagnostic ->
|
diagnosticList.allDiagnostics.forEach { diagnostic ->
|
||||||
for (typeArgument in diagnostic.getAllTypeArguments()) {
|
for (typeArgument in diagnostic.getAllTypeArguments()) {
|
||||||
typeArgument.collectClassNamesTo(this)
|
typeArgument.collectClassNamesTo(this)
|
||||||
|
|||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* 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.analysis.diagnostics.jvm
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
object FirJvmErrors {
|
||||||
|
// Declarations
|
||||||
|
val CONFLICTING_JVM_DECLARATIONS by error0<PsiElement>()
|
||||||
|
|
||||||
|
}
|
||||||
+20
-3
@@ -15,8 +15,25 @@ import java.nio.file.Path
|
|||||||
object DiagnosticClassGenerator {
|
object DiagnosticClassGenerator {
|
||||||
fun generate(rootPath: Path, diagnosticList: DiagnosticList, packageName: String) {
|
fun generate(rootPath: Path, diagnosticList: DiagnosticList, packageName: String) {
|
||||||
val path = getGenerationPath(rootPath.toFile(), packageName)
|
val path = getGenerationPath(rootPath.toFile(), packageName)
|
||||||
KtDiagnosticClassRenderer.render(path.resolve("KtFirDiagnostics.kt"), diagnosticList, packageName)
|
KtDiagnosticClassRenderer.render(
|
||||||
KtDiagnosticClassImplementationRenderer.render(path.resolve("KtFirDiagnosticsImpl.kt"), diagnosticList, packageName)
|
path.resolve("KtFirDiagnostics.kt"),
|
||||||
FirDiagnosticToKtDiagnosticConverterRenderer.render(path.resolve("KtFirDataClassConverters.kt"), diagnosticList, packageName)
|
diagnosticList,
|
||||||
|
packageName,
|
||||||
|
"KtFirDiagnostics"
|
||||||
|
)
|
||||||
|
|
||||||
|
KtDiagnosticClassImplementationRenderer.render(
|
||||||
|
path.resolve("KtFirDiagnosticsImpl.kt"),
|
||||||
|
diagnosticList,
|
||||||
|
packageName,
|
||||||
|
"KtFirDiagnosticsImpl"
|
||||||
|
)
|
||||||
|
|
||||||
|
FirDiagnosticToKtDiagnosticConverterRenderer.render(
|
||||||
|
path.resolve("KtFirDataClassConverters.kt"),
|
||||||
|
diagnosticList,
|
||||||
|
packageName,
|
||||||
|
"KtFirDataClassConverters"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.util.SmartPrinter
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
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, containingObjectName: String) {
|
||||||
val hlDiagnosticsList = HLDiagnosticConverter.convert(diagnosticList)
|
val hlDiagnosticsList = HLDiagnosticConverter.convert(diagnosticList)
|
||||||
file.writeToFileUsingSmartPrinterIfFileContentChanged { render(hlDiagnosticsList, packageName) }
|
file.writeToFileUsingSmartPrinterIfFileContentChanged { render(hlDiagnosticsList, packageName) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user