diff --git a/compiler/fir/checkers/checkers-component-generator/build.gradle.kts b/compiler/fir/checkers/checkers-component-generator/build.gradle.kts index c6df8b80051..e57d16ffdb9 100644 --- a/compiler/fir/checkers/checkers-component-generator/build.gradle.kts +++ b/compiler/fir/checkers/checkers-component-generator/build.gradle.kts @@ -9,6 +9,14 @@ dependencies { implementation(project(":compiler:fir:tree:tree-generator")) implementation(project(":kotlin-reflect")) implementation(project(":kotlin-reflect-api")) + + /* + We do not need guava in the generator, but because of a bug in the IJ project importing, we need to have a dependency on intellijCoreDep + the same as it is in `:fir:tree:tree-generator` module to the project be imported correctly + */ + compileOnly(intellijCoreDep()) { includeJars("intellij-core", "guava", rootProject = rootProject) } + + implementation(project(":compiler:psi")) } val writeCopyright by task { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Generator.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Generator.kt index 1732f7aa22b..a7c858f9dbf 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Generator.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Generator.kt @@ -20,16 +20,7 @@ class Generator( private val packageName: String, private val abstractCheckerName: String ) { - private val generationPath: File - - init { - var path = generationPath - packageName.split(".").forEach { - path = path.resolve(it) - } - path.mkdirs() - this.generationPath = path - } + private val generationPath: File = getGenerationPath(generationPath, packageName) private fun generateAliases() { val filename = "${abstractCheckerName}Aliases.kt" diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/ImportPrinter.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/ImportPrinter.kt new file mode 100644 index 00000000000..69a52ac5c5a --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/ImportPrinter.kt @@ -0,0 +1,33 @@ +/* + * 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 + +import org.jetbrains.kotlin.fir.tree.generator.printer.SmartPrinter + +private object ImportPrinter { + fun SmartPrinter.printImports(imports: Collection) { + val importsToPrint = imports.filterNot { it.isDefaultImport() }.distinct().sorted() + for (import in importsToPrint) { + println("import $import") + } + } + + private fun String.isDefaultImport() = substringBeforeLast('.') in defaultImportedPackages + + private val defaultImportedPackages = setOf( + "kotlin", + "kotlin.annotation", + "kotlin.collections", + "kotlin.ranges", + "kotlin.sequences", + "kotlin.text", + "kotlin.io", + ) +} + +fun SmartPrinter.printImports(imports: Collection) { + with(ImportPrinter) { printImports(imports) } +} 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 add59c21a70..1b7b133ac44 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 @@ -5,6 +5,8 @@ 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.generateDiagnostics import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import java.io.File @@ -43,6 +45,9 @@ fun main(args: Array) { classFqn = "org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker" ) } + + val diagnosticsPackage = "org.jetbrains.kotlin.fir.analysis.diagnostics" + generateDiagnostics(generationPath, diagnosticsPackage, DIAGNOSTICS_LIST) } /* diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt new file mode 100644 index 00000000000..aa68768b292 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt @@ -0,0 +1,93 @@ +/* + * 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.diagnostics.Severity +import org.jetbrains.kotlin.fir.FirSourceElement +import kotlin.reflect.KClass +import kotlin.reflect.KType + +data class Diagnostic( + val severity: Severity, + val name: String, + val sourceElementType: KType, + val psiType: KType, + val parameters: List, + val positioningStrategy: PositioningStrategy, +) + +data class DiagnosticParameter( + val name: String, + val type: KType +) + +enum class PositioningStrategy(val expressionToCreate: String, val import: String) { + DEFAULT( + "SourceElementPositioningStrategies.DEFAULT", + positioningStrategiesImport + ), + + VAL_OR_VAR_NODE( + "SourceElementPositioningStrategies.VAL_OR_VAR_NODE", + positioningStrategiesImport + ), + + SECONDARY_CONSTRUCTOR_DELEGATION_CALL( + "SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL", + positioningStrategiesImport + ), + + DECLARATION_NAME( + "SourceElementPositioningStrategies.DECLARATION_NAME", + positioningStrategiesImport + ), + + DECLARATION_SIGNATURE( + "SourceElementPositioningStrategies.DECLARATION_SIGNATURE", + positioningStrategiesImport + ), + + DECLARATION_SIGNATURE_OR_DEFAULT( + "SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT", + positioningStrategiesImport + ), + + VISIBILITY_MODIFIER( + "SourceElementPositioningStrategies.VISIBILITY_MODIFIER", + positioningStrategiesImport + ), + + MODALITY_MODIFIER( + "SourceElementPositioningStrategies.MODALITY_MODIFIER", + positioningStrategiesImport + ), + + OPERATOR( + "SourceElementPositioningStrategies.OPERATOR", + positioningStrategiesImport + ), + + PARAMETER_DEFAULT_VALUE( + "SourceElementPositioningStrategies.PARAMETER_DEFAULT_VALUE", + positioningStrategiesImport + ), + + PARAMETER_VARARG_MODIFIER( + "SourceElementPositioningStrategies.PARAMETER_VARARG_MODIFIER", + positioningStrategiesImport + ), +} + +private const val positioningStrategiesImport = "org.jetbrains.kotlin.fir.analysis.diagnostics.SourceElementPositioningStrategies" + + +fun Diagnostic.hasDefaultPositioningStrategy(): Boolean = + positioningStrategy == PositioningStrategy.DEFAULT + +data class DiagnosticList( + val diagnostics: List, +) \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt new file mode 100644 index 00000000000..5c83b0e8382 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt @@ -0,0 +1,96 @@ +/* + * 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.diagnostics.Severity +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.PrivateForInline +import kotlin.properties.PropertyDelegateProvider +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +class DiagnosticListBuilder private constructor() { + @PrivateForInline + val diagnostics = mutableListOf() + + @OptIn(PrivateForInline::class) + inline fun error( + positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT, + crossinline init: DiagnosticBuilder.() -> Unit = {} + ) = diagnosticDelegateProvider(Severity.ERROR, positioningStrategy, init) + + + @OptIn(PrivateForInline::class) + inline fun warning( + positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT, + crossinline init: DiagnosticBuilder.() -> Unit = {} + ) = diagnosticDelegateProvider(Severity.WARNING, positioningStrategy, init) + + @PrivateForInline + @OptIn(ExperimentalStdlibApi::class) + inline fun diagnosticDelegateProvider( + severity: Severity, + positioningStrategy: PositioningStrategy, + crossinline init: DiagnosticBuilder.() -> Unit = {} + ) = PropertyDelegateProvider { _, property -> + diagnostics += DiagnosticBuilder( + severity, + name = property.name, + sourceElementType = typeOf(), + psiType = typeOf

(), + positioningStrategy, + ).apply(init).build() + AlwaysReturningUnitPropertyDelegate + } + + @PrivateForInline + object AlwaysReturningUnitPropertyDelegate : ReadOnlyProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>) = Unit + } + + @OptIn(PrivateForInline::class) + private fun build() = DiagnosticList(diagnostics) + + companion object { + fun buildDiagnosticList(init: DiagnosticListBuilder.() -> Unit) = + DiagnosticListBuilder().apply(init).build() + } +} + +class DiagnosticBuilder( + private val severity: Severity, + private val name: String, + private val sourceElementType: KType, + private val psiType: KType, + private val positioningStrategy: PositioningStrategy +) { + @PrivateForInline + val parameters = mutableListOf() + + @OptIn(PrivateForInline::class, ExperimentalStdlibApi::class) + inline fun parameter(name: String) { + if (parameters.size == 3) { + error("Diagnostic cannot have more than 3 parameters") + } + parameters += DiagnosticParameter( + name = name, + type = typeOf() + ) + } + + @OptIn(PrivateForInline::class) + fun build() = Diagnostic( + severity, + name, + sourceElementType, + psiType, + parameters, + positioningStrategy, + ) +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListGenerator.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListGenerator.kt new file mode 100644 index 00000000000..d2da1a8fdb1 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListGenerator.kt @@ -0,0 +1,14 @@ +/* + * 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 org.jetbrains.kotlin.fir.checkers.generator.getGenerationPath +import java.io.File + +fun generateDiagnostics(rootPath: File, packageName: String, diagnosticList: DiagnosticList) { + val generationPath = getGenerationPath(rootPath, packageName) + ErrorListDiagnosticListRenderer.render(generationPath.resolve("FirErrors.kt"), diagnosticList, packageName) +} diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListRenderer.kt new file mode 100644 index 00000000000..0efa0aaf7a2 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListRenderer.kt @@ -0,0 +1,12 @@ +/* + * 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 java.io.File + +abstract class DiagnosticListRenderer { + abstract fun render(file: File, diagnosticList: DiagnosticList, packageName: String) +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt new file mode 100644 index 00000000000..d860ae84753 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt @@ -0,0 +1,124 @@ +/* + * 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 org.jetbrains.kotlin.fir.checkers.generator.* +import org.jetbrains.kotlin.fir.tree.generator.printer.SmartPrinter +import org.jetbrains.kotlin.fir.tree.generator.printer.printCopyright +import org.jetbrains.kotlin.fir.tree.generator.printer.printGeneratedMessage +import org.jetbrains.kotlin.fir.tree.generator.printer.useSmartPrinter +import java.io.File +import kotlin.reflect.KClass +import kotlin.reflect.KType +import kotlin.reflect.KTypeProjection + +object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() { + override fun render(file: File, diagnosticList: DiagnosticList, packageName: String) { + file.useSmartPrinter { + render(diagnosticList, packageName) + } + } + + private fun SmartPrinter.render(diagnosticList: DiagnosticList, packageName: String) { + printCopyright() + println("package $packageName") + println() + collectAndPrintImports(diagnosticList) + printGeneratedMessage() + printErrorsObject(diagnosticList) + } + + private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList) { + inBracketsWithIndent("object FirErrors") { + for (it in diagnosticList.diagnostics) { + printDiagnostic(it) + } + } + } + + private fun SmartPrinter.printDiagnostic(diagnostic: Diagnostic) { + print("val ${diagnostic.name} by ${diagnostic.getFactoryFunction()}") + printTypeArguments(diagnostic.getAllTypeArguments()) + printPositioningStrategy(diagnostic) + println() + } + + private fun SmartPrinter.printPositioningStrategy(diagnostic: Diagnostic) { + print("(") + if (!diagnostic.hasDefaultPositioningStrategy()) { + print(diagnostic.positioningStrategy.expressionToCreate) + } + print(")") + } + + + @OptIn(ExperimentalStdlibApi::class) + private fun Diagnostic.getAllTypeArguments(): List = buildList { + add(sourceElementType) + add(psiType) + parameters.mapTo(this) { it.type } + } + + private fun SmartPrinter.printTypeArguments(typeArguments: List) { + print("<") + printSeparatedWithComma(typeArguments) { typeArgument -> + printType(typeArgument) + } + print(">") + } + + private fun SmartPrinter.printType(type: KType) { + print(type.kClass.simpleName!!) + if (type.arguments.isNotEmpty()) { + print("<") + printSeparatedWithComma(type.arguments) { typeArgument -> + printTypeArgument(typeArgument) + } + print(">") + } + } + + private fun SmartPrinter.printTypeArgument(typeArgument: KTypeProjection) { + val typeArgumentType = typeArgument.type + if (typeArgumentType == null) { + print("*") + } else { + printType(typeArgumentType) + } + } + + private fun SmartPrinter.collectAndPrintImports(diagnosticList: DiagnosticList) { + val imports = collectImports(diagnosticList) + printImports(imports) + println() + } + + @OptIn(ExperimentalStdlibApi::class) + private fun collectImports(diagnosticList: DiagnosticList): Collection = buildSet { + diagnosticList.diagnostics.forEach { diagnostic -> + diagnostic.getAllTypeArguments().mapTo(this) { it.kClass.qualifiedName!! } + if (!diagnostic.hasDefaultPositioningStrategy()) { + add(diagnostic.positioningStrategy.import) + } + } + } + + + private val KType.kClass: KClass<*> + get() = classifier as KClass<*> + + private fun Diagnostic.getFactoryFunction(): String = + severity.name.toLowerCase() + parameters.size +} + +private inline fun SmartPrinter.printSeparatedWithComma(list: List, printItem: (T) -> Unit) { + list.forEachIndexed { index, element -> + printItem(element) + if (index != list.lastIndex) { + print(", ") + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt new file mode 100644 index 00000000000..d4a22b134d2 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -0,0 +1,324 @@ +/* + * 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 com.intellij.psi.PsiTypeElement +import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange +import org.jetbrains.kotlin.fir.FirEffectiveVisibility +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.PrivateForInline +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.* + + +@Suppress("UNUSED_VARIABLE", "LocalVariableName") +@OptIn(PrivateForInline::class) +val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList { + // Miscellaneous + val SYNTAX by error() + val OTHER_ERROR by error() + + // General syntax + val ILLEGAL_CONST_EXPRESSION by error() + val ILLEGAL_UNDERSCORE by error() + val EXPRESSION_REQUIRED by error() + val BREAK_OR_CONTINUE_OUTSIDE_A_LOOP by error() + val NOT_A_LOOP_LABEL by error() + val VARIABLE_EXPECTED by error() + val RETURN_NOT_ALLOWED by error() + val DELEGATION_IN_INTERFACE by error() + + // Unresolved + val HIDDEN by error { + parameter>("hidden") + } + val UNRESOLVED_REFERENCE by error { + parameter("reference") + } + val UNRESOLVED_LABEL by error() + val DESERIALIZATION_ERROR by error() + val ERROR_FROM_JAVA_RESOLUTION by error() + val UNKNOWN_CALLABLE_KIND by error() + val MISSING_STDLIB_CLASS by error() + val NO_THIS by error() + + // Super + val SUPER_IS_NOT_AN_EXPRESSION by error() + val SUPER_NOT_AVAILABLE by error() + val ABSTRACT_SUPER_CALL by error() + val INSTANCE_ACCESS_BEFORE_SUPER_CALL by error() { + parameter("target") + } + + // Supertypes + val TYPE_PARAMETER_AS_SUPERTYPE by error() + val ENUM_AS_SUPERTYPE by error() + val RECURSION_IN_SUPERTYPES by error() + val NOT_A_SUPERTYPE by error() + val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error() + val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error() { + parameter>("otherSuperType") + } + val SUPERTYPE_INITIALIZED_IN_INTERFACE by error() + val INTERFACE_WITH_SUPERCLASS by error() + val CLASS_IN_SUPERTYPE_FOR_ENUM by error() + val SEALED_SUPERTYPE by error() + val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error() + + // Constructor problems + val CONSTRUCTOR_IN_OBJECT by error(PositioningStrategy.DECLARATION_SIGNATURE) + val CONSTRUCTOR_IN_INTERFACE by error(PositioningStrategy.DECLARATION_SIGNATURE) + val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error() + val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error() + val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning() + val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) + val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning() + val DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR by warning() + val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by warning() + val EXPLICIT_DELEGATION_CALL_REQUIRED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) + val SEALED_CLASS_CONSTRUCTOR_CALL by error() + + // Annotations + val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error() + val ANNOTATION_ARGUMENT_MUST_BE_CONST by error() + val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error() + val ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL by error() + val ANNOTATION_CLASS_MEMBER by error() + val ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT by error() + val INVALID_TYPE_OF_ANNOTATION_MEMBER by error() + val LOCAL_ANNOTATION_CLASS_ERROR by error() + val MISSING_VAL_ON_ANNOTATION_PARAMETER by error() + val NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION by error() + val NOT_AN_ANNOTATION_CLASS by error { + parameter("annotationName") + } + val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error() + val VAR_ANNOTATION_PARAMETER by error(PositioningStrategy.VAL_OR_VAR_NODE) + + // Exposed visibility group + val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + + val EXPOSED_RECEIVER_TYPE by exposedVisibilityError() + val EXPOSED_PROPERTY_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + val EXPOSED_PARAMETER_TYPE by exposedVisibilityError(/* // NB: for parameter FE 1.0 reports not on a name for some reason */) + val EXPOSED_SUPER_INTERFACE by exposedVisibilityError() + val EXPOSED_SUPER_CLASS by exposedVisibilityError< KtTypeReference>() + val EXPOSED_TYPE_PARAMETER_BOUND by exposedVisibilityError() + + // Modifiers + val INAPPLICABLE_INFIX_MODIFIER by error { + parameter("modifier") // TODO or it should be a message? + } + val REPEATED_MODIFIER by error { + parameter("modifier") + } + val REDUNDANT_MODIFIER by error { + parameter("redundantModifier") + parameter("conflictingModifier") + } + val DEPRECATED_MODIFIER_PAIR by error { + parameter("deprecatedModifier") + parameter("conflictingModifier") + } + val INCOMPATIBLE_MODIFIERS by error { + parameter("modifier1") + parameter("modifier2") + } + val REDUNDANT_OPEN_IN_INTERFACE by warning(PositioningStrategy.MODALITY_MODIFIER) + + // Applicability + val NONE_APPLICABLE by error { + parameter>>("candidates") + } + + val INAPPLICABLE_CANDIDATE by error { + parameter>("candidate") + } + val INAPPLICABLE_LATEINIT_MODIFIER by error() { + parameter("reason") + } + + // Ambiguity + val AMBIGUITY by error { + parameter>>("candidates") + } + val ASSIGN_OPERATOR_AMBIGUITY by error { + parameter>>("candidates") + } + + // Types & type parameters + val TYPE_MISMATCH by error{ + parameter("expectedType") + parameter("actualType") + } + val RECURSION_IN_IMPLICIT_TYPES by error() + val INFERENCE_ERROR by error() + val PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT by error() + val UPPER_BOUND_VIOLATED by error { + parameter("typeParameter") + parameter("violatedType") + } + val TYPE_ARGUMENTS_NOT_ALLOWED by error() + val WRONG_NUMBER_OF_TYPE_ARGUMENTS by error { + parameter("expectedCount") + parameter>("classifier") + } + val NO_TYPE_FOR_TYPE_PARAMETER by error() + val TYPE_PARAMETERS_IN_OBJECT by error() + val ILLEGAL_PROJECTION_USAGE by error() + val TYPE_PARAMETERS_IN_ENUM by error() + val CONFLICTING_PROJECTION by error { + parameter("type") // TODO use ConeType instead of String + } + val VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED by error() + val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("returnType") // TODO use ConeType instead of String + parameter("superFunction") + } + val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("propertyType") // TODO use ConeType instead of String + parameter("targetProperty") + } + val VAR_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("variableType") // TODO use ConeType instead of String + parameter("targetVariable") + } + + // Redeclarations + val MANY_COMPANION_OBJECTS by error() + val CONFLICTING_OVERLOADS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("conflictingOverloads") // TODO use Collection instead of String + } + val REDECLARATION by error() { + parameter("conflictingDeclaration") // TODO use Collection instead of String + } + val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error() + + // Invalid local declarations + val LOCAL_OBJECT_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { + parameter("objectName") + } + val LOCAL_INTERFACE_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { + parameter("interfaceName") + } + + // Functions + val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("function") + parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration + } + val ABSTRACT_FUNCTION_WITH_BODY by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("function") + } + val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { + parameter("function") + } + val PRIVATE_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.VISIBILITY_MODIFIER) { + parameter("function") + } + + val NON_MEMBER_FUNCTION_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { + parameter("function") + } + + + val FUNCTION_DECLARATION_WITH_NO_NAME by error(PositioningStrategy.DECLARATION_SIGNATURE) + + // TODO: val ANONYMOUS_FUNCTION_WITH_NAME by error1(SourceElementPositioningStrategies.DECLARATION_NAME) + val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error(PositioningStrategy.PARAMETER_DEFAULT_VALUE) + val USELESS_VARARG_ON_PARAMETER by warning() + + + // Properties & accessors + val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("property") + parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration + } + val PRIVATE_PROPERTY_IN_INTERFACE by error(PositioningStrategy.VISIBILITY_MODIFIER) + + val ABSTRACT_PROPERTY_WITH_INITIALIZER by error() + val PROPERTY_INITIALIZER_IN_INTERFACE by error() + val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error(PositioningStrategy.DECLARATION_SIGNATURE) + + val ABSTRACT_DELEGATED_PROPERTY by error() + val DELEGATED_PROPERTY_IN_INTERFACE by error() + // TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1() + + val ABSTRACT_PROPERTY_WITH_GETTER by error() + val ABSTRACT_PROPERTY_WITH_SETTER by error() + val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error() + val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error() + val EXPECTED_PRIVATE_DECLARATION by error(PositioningStrategy.VISIBILITY_MODIFIER) + + // Multi-platform projects + val EXPECTED_DECLARATION_WITH_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) + val EXPECTED_PROPERTY_INITIALIZER by error() + // TODO: need to cover `by` as well as delegate expression + val EXPECTED_DELEGATED_PROPERTY by error() + + + // Destructuring declaration + val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error() + val COMPONENT_FUNCTION_MISSING by error { + parameter("missingFunctionName") + parameter("destructingType") + } + val COMPONENT_FUNCTION_AMBIGUITY by error { + parameter("functionWithAmbiguityName") + parameter>>("candidates") + } + // TODO: val COMPONENT_FUNCTION_ON_NULLABLE by ... + // TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ... + + // Control flow diagnostics + val UNINITIALIZED_VARIABLE by error { + parameter("variable") + } + val WRONG_INVOCATION_KIND by warning { + parameter< AbstractFirBasedSymbol<*>>("declaration") + parameter("requiredRange") + parameter("actualRange") + } + val LEAKED_IN_PLACE_LAMBDA by error { + parameter>("lambda") + } + val WRONG_IMPLIES_CONDITION by warning() + + // Extended checkers group + val REDUNDANT_VISIBILITY_MODIFIER by warning(PositioningStrategy.VISIBILITY_MODIFIER) + val REDUNDANT_MODALITY_MODIFIER by warning(PositioningStrategy.MODALITY_MODIFIER) + val REDUNDANT_RETURN_UNIT_TYPE by warning() + val REDUNDANT_EXPLICIT_TYPE by warning() + val REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE by warning() + val CAN_BE_VAL by warning(PositioningStrategy.VAL_OR_VAR_NODE) + val CAN_BE_REPLACED_WITH_OPERATOR_ASSIGNMENT by warning(PositioningStrategy.OPERATOR) + val REDUNDANT_CALL_OF_CONVERSION_METHOD by warning() + val ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS by warning(PositioningStrategy.OPERATOR) + val EMPTY_RANGE by warning() + val REDUNDANT_SETTER_PARAMETER_TYPE by warning() + val UNUSED_VARIABLE by warning(PositioningStrategy.DECLARATION_NAME) + val ASSIGNED_VALUE_IS_NEVER_READ by warning() + val VARIABLE_INITIALIZER_IS_REDUNDANT by warning() + val VARIABLE_NEVER_READ by warning(PositioningStrategy.DECLARATION_NAME) + val USELESS_CALL_ON_NOT_NULL by warning() +} + +private inline fun DiagnosticListBuilder.exposedVisibilityError( + positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT +) = error(positioningStrategy) { + parameter("elementVisibility") + parameter("restrictingDeclaration") + parameter("restrictingVisibility") +} diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/smartPrinterUtils.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/smartPrinterUtils.kt new file mode 100644 index 00000000000..604d176b4f8 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/smartPrinterUtils.kt @@ -0,0 +1,15 @@ +/* + * 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 + +import org.jetbrains.kotlin.fir.tree.generator.printer.SmartPrinter +import org.jetbrains.kotlin.fir.tree.generator.printer.withIndent + +inline fun SmartPrinter.inBracketsWithIndent(header: String = "", body: () -> Unit) { + println("$header {") + withIndent(body) + println("}") +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/utils.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/utils.kt new file mode 100644 index 00000000000..c6152aac566 --- /dev/null +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/utils.kt @@ -0,0 +1,14 @@ +/* + * 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 + +import java.io.File + +fun getGenerationPath(rootPath: File, packageName: String): File = + packageName + .split(".") + .fold(rootPath, File::resolve) + .apply { mkdirs() } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt similarity index 69% rename from compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt rename to compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 94b33f8e56a..a96a12e3ecc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -8,28 +8,40 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics import com.intellij.psi.PsiElement import com.intellij.psi.PsiTypeElement import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange -import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirEffectiveVisibility import org.jetbrains.kotlin.fir.FirSourceElement -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.analysis.diagnostics.SourceElementPositioningStrategies import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.expressions.WhenMissingCase import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtDestructuringDeclaration +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.KtModifierListOwner +import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtPropertyAccessor +import org.jetbrains.kotlin.psi.KtPropertyDelegate +import org.jetbrains.kotlin.psi.KtTypeReference + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ object FirErrors { - // Miscellaneous val SYNTAX by error0() val OTHER_ERROR by error0() - - // General syntax val ILLEGAL_CONST_EXPRESSION by error0() val ILLEGAL_UNDERSCORE by error0() val EXPRESSION_REQUIRED by error0() @@ -38,8 +50,6 @@ object FirErrors { val VARIABLE_EXPECTED by error0() val RETURN_NOT_ALLOWED by error0() val DELEGATION_IN_INTERFACE by error0() - - // Unresolved val HIDDEN by error1>() val UNRESOLVED_REFERENCE by error1() val UNRESOLVED_LABEL by error0() @@ -48,14 +58,10 @@ object FirErrors { val UNKNOWN_CALLABLE_KIND by error0() val MISSING_STDLIB_CLASS by error0() val NO_THIS by error0() - - // Super val SUPER_IS_NOT_AN_EXPRESSION by error0() val SUPER_NOT_AVAILABLE by error0() val ABSTRACT_SUPER_CALL by error0() val INSTANCE_ACCESS_BEFORE_SUPER_CALL by error1() - - // Supertypes val TYPE_PARAMETER_AS_SUPERTYPE by error0() val ENUM_AS_SUPERTYPE by error0() val RECURSION_IN_SUPERTYPES by error0() @@ -67,12 +73,10 @@ object FirErrors { val CLASS_IN_SUPERTYPE_FOR_ENUM by error0() val SEALED_SUPERTYPE by error0() val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error0() - - // Constructor problems val CONSTRUCTOR_IN_OBJECT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val CONSTRUCTOR_IN_INTERFACE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by existing0() - val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by existing0() + val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error0() + val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error0() val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning0() val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning0(SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning0() @@ -80,50 +84,38 @@ object FirErrors { val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by warning0() val EXPLICIT_DELEGATION_CALL_REQUIRED by warning0(SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SEALED_CLASS_CONSTRUCTOR_CALL by error0() - - // Annotations - val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by existing0() - val ANNOTATION_ARGUMENT_MUST_BE_CONST by existing0() - val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by existing0() - val ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL by existing0() - val ANNOTATION_CLASS_MEMBER by existing0() - val ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT by existing0() - val INVALID_TYPE_OF_ANNOTATION_MEMBER by existing0() - val LOCAL_ANNOTATION_CLASS_ERROR by existing0() - val MISSING_VAL_ON_ANNOTATION_PARAMETER by existing0() - val NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION by existing0() + val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error0() + val ANNOTATION_ARGUMENT_MUST_BE_CONST by error0() + val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error0() + val ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL by error0() + val ANNOTATION_CLASS_MEMBER by error0() + val ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT by error0() + val INVALID_TYPE_OF_ANNOTATION_MEMBER by error0() + val LOCAL_ANNOTATION_CLASS_ERROR by error0() + val MISSING_VAL_ON_ANNOTATION_PARAMETER by error0() + val NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION by error0() val NOT_AN_ANNOTATION_CLASS by error1() - val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by existing0() + val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error0() val VAR_ANNOTATION_PARAMETER by error0(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) - - // Exposed visibility group val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_FUNCTION_RETURN_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_RECEIVER_TYPE by error3() val EXPOSED_PROPERTY_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) - val EXPOSED_PARAMETER_TYPE by error3(/* // NB: for parameter FE 1.0 reports not on a name for some reason */) + val EXPOSED_PARAMETER_TYPE by error3() val EXPOSED_SUPER_INTERFACE by error3() val EXPOSED_SUPER_CLASS by error3() val EXPOSED_TYPE_PARAMETER_BOUND by error3() - - // Modifiers - val INAPPLICABLE_INFIX_MODIFIER by error0() + val INAPPLICABLE_INFIX_MODIFIER by error1() val REPEATED_MODIFIER by error1() val REDUNDANT_MODIFIER by error2() val DEPRECATED_MODIFIER_PAIR by error2() val INCOMPATIBLE_MODIFIERS by error2() - val REDUNDANT_OPEN_IN_INTERFACE by warning0(SourceElementPositioningStrategies.OPEN_MODIFIER) - - // Applicability + val REDUNDANT_OPEN_IN_INTERFACE by warning0(SourceElementPositioningStrategies.MODALITY_MODIFIER) val NONE_APPLICABLE by error1>>() val INAPPLICABLE_CANDIDATE by error1>() val INAPPLICABLE_LATEINIT_MODIFIER by error1() - - // Ambiguity val AMBIGUITY by error1>>() val ASSIGN_OPERATOR_AMBIGUITY by error1>>() - - // Types & type parameters val TYPE_MISMATCH by error2() val RECURSION_IN_IMPLICIT_TYPES by error0() val INFERENCE_ERROR by error0() @@ -136,106 +128,46 @@ object FirErrors { val ILLEGAL_PROJECTION_USAGE by error0() val TYPE_PARAMETERS_IN_ENUM by error0() val CONFLICTING_PROJECTION by error1() - val VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED by error0(SourceElementPositioningStrategies.VARIANCE_MODIFIER) - val CATCH_PARAMETER_WITH_DEFAULT_VALUE by error0() - val REIFIED_TYPE_IN_CATCH_CLAUSE by error0() - val TYPE_PARAMETER_IN_CATCH_CLAUSE by error0() - val GENERIC_THROWABLE_SUBCLASS by error0() - val INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS by error0(SourceElementPositioningStrategies.DECLARATION_NAME) - - // Overrides - val NOTHING_TO_OVERRIDE by error1(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) - val OVERRIDING_FINAL_MEMBER by error2, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) - - val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) - val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) - - val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) - val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) - val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) - - val VAR_OVERRIDDEN_BY_VAL by error2(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) - - // Redeclarations + val VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED by error0() + val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2() + val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2() + val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2() val MANY_COMPANION_OBJECTS by error0() val CONFLICTING_OVERLOADS by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val REDECLARATION by error1() val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error0() - - // Invalid local declarations val LOCAL_OBJECT_NOT_ALLOWED by error1(SourceElementPositioningStrategies.DECLARATION_NAME) val LOCAL_INTERFACE_NOT_ALLOWED by error1(SourceElementPositioningStrategies.DECLARATION_NAME) - - // Functions - val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) - val ABSTRACT_FUNCTION_WITH_BODY by error1(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) + val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.MODALITY_MODIFIER) + val ABSTRACT_FUNCTION_WITH_BODY by error1(SourceElementPositioningStrategies.MODALITY_MODIFIER) val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - val PRIVATE_FUNCTION_WITH_NO_BODY by error1(SourceElementPositioningStrategies.PRIVATE_MODIFIER) + val PRIVATE_FUNCTION_WITH_NO_BODY by error1(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val NON_MEMBER_FUNCTION_NO_BODY by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - val FUNCTION_DECLARATION_WITH_NO_NAME by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - - // TODO: val ANONYMOUS_FUNCTION_WITH_NAME by error1(SourceElementPositioningStrategies.DECLARATION_NAME) val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error0(SourceElementPositioningStrategies.PARAMETER_DEFAULT_VALUE) val USELESS_VARARG_ON_PARAMETER by warning0() - - // Properties & accessors - val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) - val PRIVATE_PROPERTY_IN_INTERFACE by error0(SourceElementPositioningStrategies.PRIVATE_MODIFIER) - + val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.MODALITY_MODIFIER) + val PRIVATE_PROPERTY_IN_INTERFACE by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val ABSTRACT_PROPERTY_WITH_INITIALIZER by error0() - // TODO: val MUST_BE_INITIALIZED by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - // TODO: val MUST_BE_INITIALIZED_OR_BE_ABSTRACT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - // TODO: val EXTENSION_PROPERTY_MUST_HAVE_ACCESSORS_OR_BE_ABSTRACT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - - // TODO: val EXTENSION_PROPERTY_WITH_BACKING_FIELD by error0() - // TODO: val PROPERTY_INITIALIZER_NO_BACKING_FIELD by error0() - val PROPERTY_INITIALIZER_IN_INTERFACE by error0() val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - // TODO: val BACKING_FIELD_IN_INTERFACE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - val ABSTRACT_DELEGATED_PROPERTY by error0() val DELEGATED_PROPERTY_IN_INTERFACE by error0() - // TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1() - val ABSTRACT_PROPERTY_WITH_GETTER by error0() val ABSTRACT_PROPERTY_WITH_SETTER by error0() val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error0() val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error0() - - // Multi-platform projects + val EXPECTED_PRIVATE_DECLARATION by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val EXPECTED_DECLARATION_WITH_BODY by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val EXPECTED_PROPERTY_INITIALIZER by error0() - // TODO: need to cover `by` as well as delegate expression val EXPECTED_DELEGATED_PROPERTY by error0() - val EXPECTED_PRIVATE_DECLARATION by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) - - // Destructuring declaration val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error0() - val COMPONENT_FUNCTION_MISSING by error2() - val COMPONENT_FUNCTION_AMBIGUITY by error2>>() - val COMPONENT_FUNCTION_ON_NULLABLE by error1() - // TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ... - - // Control flow diagnostics + val COMPONENT_FUNCTION_MISSING by error2() + val COMPONENT_FUNCTION_AMBIGUITY by error2>>() val UNINITIALIZED_VARIABLE by error1() val WRONG_INVOCATION_KIND by warning3, EventOccurrencesRange, EventOccurrencesRange>() val LEAKED_IN_PLACE_LAMBDA by error1>() val WRONG_IMPLIES_CONDITION by warning0() - - // Nullability - val UNSAFE_CALL by error1(SourceElementPositioningStrategies.DOT_BY_SELECTOR) - // TODO: val UNSAFE_IMPLICIT_INVOKE_CALL by error1() - // TODO: val UNSAFE_INFIX_CALL by ... - // TODO: val UNSAFE_OPERATOR_CALL by ... - // TODO: val UNEXPECTED_SAFE_CALL by ... - - // When expressions - val NO_ELSE_IN_WHEN by error1>(SourceElementPositioningStrategies.WHEN_EXPRESSION) - val INVALID_IF_AS_EXPRESSION by error0(SourceElementPositioningStrategies.IF_EXPRESSION) - - // Extended checkers group val REDUNDANT_VISIBILITY_MODIFIER by warning0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val REDUNDANT_MODALITY_MODIFIER by warning0(SourceElementPositioningStrategies.MODALITY_MODIFIER) val REDUNDANT_RETURN_UNIT_TYPE by warning0() diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/SmartPrinter.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/SmartPrinter.kt index 19254441427..a22a67d339d 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/SmartPrinter.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/SmartPrinter.kt @@ -38,6 +38,9 @@ class SmartPrinter(appendable: Appendable) { fun popIndent() { printer.popIndent() } + + fun getCurrentIndentInUnits() = printer.currentIndentLengthInUnits + fun getIndentUnit() = printer.indentUnitLength } inline fun SmartPrinter.withIndent(block: () -> Unit) {