FIR: transform DiagnosticBuilder DSL to an object
To make diagnostics visible in symbol search in IJ
This commit is contained in:
+1
-6
@@ -15,7 +15,6 @@ data class DiagnosticData(
|
|||||||
val psiType: KType,
|
val psiType: KType,
|
||||||
val parameters: List<DiagnosticParameter>,
|
val parameters: List<DiagnosticParameter>,
|
||||||
val positioningStrategy: PositioningStrategy,
|
val positioningStrategy: PositioningStrategy,
|
||||||
val group: String?,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data class DiagnosticParameter(
|
data class DiagnosticParameter(
|
||||||
@@ -55,8 +54,4 @@ enum class PositioningStrategy(private val strategy: String) {
|
|||||||
|
|
||||||
|
|
||||||
fun DiagnosticData.hasDefaultPositioningStrategy(): Boolean =
|
fun DiagnosticData.hasDefaultPositioningStrategy(): Boolean =
|
||||||
positioningStrategy == PositioningStrategy.DEFAULT
|
positioningStrategy == PositioningStrategy.DEFAULT
|
||||||
|
|
||||||
data class DiagnosticList(
|
|
||||||
val diagnostics: List<DiagnosticData>,
|
|
||||||
)
|
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* 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.typeOf
|
||||||
|
|
||||||
|
abstract class DiagnosticGroup @PrivateForInline constructor(val name: String) {
|
||||||
|
@Suppress("PropertyName")
|
||||||
|
@PrivateForInline
|
||||||
|
val _diagnostics = mutableListOf<DiagnosticData>()
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
val diagnostics: List<DiagnosticData>
|
||||||
|
get() = _diagnostics
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
inline fun <reified E : FirSourceElement, reified P : PsiElement> error(
|
||||||
|
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT,
|
||||||
|
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
||||||
|
) = diagnosticDelegateProvider<E, P>(Severity.ERROR, positioningStrategy, init)
|
||||||
|
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
inline fun <reified E : FirSourceElement, reified P : PsiElement> warning(
|
||||||
|
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT,
|
||||||
|
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
||||||
|
) = diagnosticDelegateProvider<E, P>(Severity.WARNING, positioningStrategy, init)
|
||||||
|
|
||||||
|
@PrivateForInline
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
inline fun <reified E : FirSourceElement, reified P : PsiElement> diagnosticDelegateProvider(
|
||||||
|
severity: Severity,
|
||||||
|
positioningStrategy: PositioningStrategy,
|
||||||
|
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
||||||
|
) = PropertyDelegateProvider<Any?, ReadOnlyProperty<DiagnosticGroup, DiagnosticData>> { _, property ->
|
||||||
|
val diagnostic = DiagnosticBuilder(
|
||||||
|
severity,
|
||||||
|
name = property.name,
|
||||||
|
sourceElementType = typeOf<E>(),
|
||||||
|
psiType = typeOf<P>(),
|
||||||
|
positioningStrategy,
|
||||||
|
).apply(init).build()
|
||||||
|
_diagnostics += diagnostic
|
||||||
|
ReadOnlyProperty { _, _ -> diagnostic }
|
||||||
|
}
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* 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.diagnostics.Severity
|
||||||
|
import org.jetbrains.kotlin.fir.PrivateForInline
|
||||||
|
import kotlin.properties.ReadOnlyProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
import kotlin.reflect.KType
|
||||||
|
import kotlin.reflect.typeOf
|
||||||
|
|
||||||
|
abstract class DiagnosticList {
|
||||||
|
@Suppress("PropertyName")
|
||||||
|
@PrivateForInline
|
||||||
|
val _groups = mutableListOf<DiagnosticGroup>()
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
val groups: List<DiagnosticGroup>
|
||||||
|
get() = _groups
|
||||||
|
|
||||||
|
val allDiagnostics: List<DiagnosticData>
|
||||||
|
get() = groups.flatMap { it.diagnostics }
|
||||||
|
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
operator fun DiagnosticGroup.provideDelegate(
|
||||||
|
thisRef: DiagnosticList,
|
||||||
|
prop: KProperty<*>
|
||||||
|
): ReadOnlyProperty<DiagnosticList, DiagnosticGroup> {
|
||||||
|
val group = this
|
||||||
|
_groups += group
|
||||||
|
return ReadOnlyProperty { _, _ -> group }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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<DiagnosticParameter>()
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class, ExperimentalStdlibApi::class)
|
||||||
|
inline fun <reified T> parameter(name: String) {
|
||||||
|
if (parameters.size == 3) {
|
||||||
|
error("Diagnostic cannot have more than 3 parameters")
|
||||||
|
}
|
||||||
|
parameters += DiagnosticParameter(
|
||||||
|
name = name,
|
||||||
|
type = typeOf<T>()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(PrivateForInline::class)
|
||||||
|
fun build() = DiagnosticData(
|
||||||
|
severity,
|
||||||
|
name,
|
||||||
|
sourceElementType,
|
||||||
|
psiType,
|
||||||
|
parameters,
|
||||||
|
positioningStrategy,
|
||||||
|
)
|
||||||
|
}
|
||||||
-112
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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<DiagnosticData>()
|
|
||||||
|
|
||||||
@PrivateForInline
|
|
||||||
var currentGroupName: String? = null
|
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
|
||||||
inline fun group(groupName: String, inner: () -> Unit) {
|
|
||||||
if (currentGroupName != null) {
|
|
||||||
error("Groups can not be nested ")
|
|
||||||
}
|
|
||||||
currentGroupName = groupName
|
|
||||||
inner()
|
|
||||||
currentGroupName = null
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
|
||||||
inline fun <reified E : FirSourceElement, reified P : PsiElement> error(
|
|
||||||
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT,
|
|
||||||
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
|
||||||
) = diagnosticDelegateProvider<E, P>(Severity.ERROR, positioningStrategy, init)
|
|
||||||
|
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
|
||||||
inline fun <reified E : FirSourceElement, reified P : PsiElement> warning(
|
|
||||||
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT,
|
|
||||||
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
|
||||||
) = diagnosticDelegateProvider<E, P>(Severity.WARNING, positioningStrategy, init)
|
|
||||||
|
|
||||||
@PrivateForInline
|
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
|
||||||
inline fun <reified E : FirSourceElement, reified P : PsiElement> diagnosticDelegateProvider(
|
|
||||||
severity: Severity,
|
|
||||||
positioningStrategy: PositioningStrategy,
|
|
||||||
crossinline init: DiagnosticBuilder.() -> Unit = {}
|
|
||||||
) = PropertyDelegateProvider<Any?, AlwaysReturningUnitPropertyDelegate> { _, property ->
|
|
||||||
diagnostics += DiagnosticBuilder(
|
|
||||||
severity,
|
|
||||||
name = property.name,
|
|
||||||
sourceElementType = typeOf<E>(),
|
|
||||||
psiType = typeOf<P>(),
|
|
||||||
positioningStrategy,
|
|
||||||
group = currentGroupName,
|
|
||||||
).apply(init).build()
|
|
||||||
AlwaysReturningUnitPropertyDelegate
|
|
||||||
}
|
|
||||||
|
|
||||||
@PrivateForInline
|
|
||||||
object AlwaysReturningUnitPropertyDelegate : ReadOnlyProperty<Any?, Unit> {
|
|
||||||
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,
|
|
||||||
private val group: String?
|
|
||||||
) {
|
|
||||||
@PrivateForInline
|
|
||||||
val parameters = mutableListOf<DiagnosticParameter>()
|
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class, ExperimentalStdlibApi::class)
|
|
||||||
inline fun <reified T> parameter(name: String) {
|
|
||||||
if (parameters.size == 3) {
|
|
||||||
error("Diagnostic cannot have more than 3 parameters")
|
|
||||||
}
|
|
||||||
parameters += DiagnosticParameter(
|
|
||||||
name = name,
|
|
||||||
type = typeOf<T>()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
|
||||||
fun build() = DiagnosticData(
|
|
||||||
severity,
|
|
||||||
name,
|
|
||||||
sourceElementType,
|
|
||||||
psiType,
|
|
||||||
parameters,
|
|
||||||
positioningStrategy,
|
|
||||||
group
|
|
||||||
)
|
|
||||||
}
|
|
||||||
+5
-6
@@ -33,19 +33,18 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
|
|||||||
|
|
||||||
private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList) {
|
private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList) {
|
||||||
inBracketsWithIndent("object FirErrors") {
|
inBracketsWithIndent("object FirErrors") {
|
||||||
val groups = diagnosticList.diagnostics.groupBy { it.group }
|
for (group in diagnosticList.groups) {
|
||||||
for ((group, diagnostics) in groups) {
|
printDiagnosticGroup(group.name, group.diagnostics)
|
||||||
printDiagnosticGroup(group, diagnostics)
|
|
||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SmartPrinter.printDiagnosticGroup(
|
private fun SmartPrinter.printDiagnosticGroup(
|
||||||
group: String?,
|
group: String,
|
||||||
diagnostics: List<DiagnosticData>
|
diagnostics: List<DiagnosticData>
|
||||||
) {
|
) {
|
||||||
println("// ${group ?: "NO GROUP"}")
|
println("// $group")
|
||||||
for (it in diagnostics) {
|
for (it in diagnostics) {
|
||||||
printDiagnostic(it)
|
printDiagnostic(it)
|
||||||
}
|
}
|
||||||
@@ -110,7 +109,7 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() {
|
|||||||
|
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
private fun collectImports(diagnosticList: DiagnosticList): Collection<String> = buildSet {
|
private fun collectImports(diagnosticList: DiagnosticList): Collection<String> = buildSet {
|
||||||
diagnosticList.diagnostics.forEach { diagnostic ->
|
diagnosticList.allDiagnostics.forEach { diagnostic ->
|
||||||
for (typeArgument in diagnostic.getAllTypeArguments()) {
|
for (typeArgument in diagnostic.getAllTypeArguments()) {
|
||||||
typeArgument.collectClassNamesTo(this)
|
typeArgument.collectClassNamesTo(this)
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-27
@@ -25,15 +25,15 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
|
|
||||||
@Suppress("UNUSED_VARIABLE", "LocalVariableName")
|
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
|
||||||
@OptIn(PrivateForInline::class)
|
@OptIn(PrivateForInline::class)
|
||||||
val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
object DIAGNOSTICS_LIST : DiagnosticList() {
|
||||||
group("Miscellaneous") {
|
val Miscellaneous by object : DiagnosticGroup("Miscellaneous") {
|
||||||
val SYNTAX by error<FirSourceElement, PsiElement>()
|
val SYNTAX by error<FirSourceElement, PsiElement>()
|
||||||
val OTHER_ERROR by error<FirSourceElement, PsiElement>()
|
val OTHER_ERROR by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("General syntax") {
|
val GENERAL_SYNTAX by object : DiagnosticGroup("General syntax") {
|
||||||
val ILLEGAL_CONST_EXPRESSION by error<FirSourceElement, PsiElement>()
|
val ILLEGAL_CONST_EXPRESSION by error<FirSourceElement, PsiElement>()
|
||||||
val ILLEGAL_UNDERSCORE by error<FirSourceElement, PsiElement>()
|
val ILLEGAL_UNDERSCORE by error<FirSourceElement, PsiElement>()
|
||||||
val EXPRESSION_REQUIRED by error<FirSourceElement, PsiElement>()
|
val EXPRESSION_REQUIRED by error<FirSourceElement, PsiElement>()
|
||||||
@@ -44,7 +44,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val DELEGATION_IN_INTERFACE by error<FirSourceElement, PsiElement>()
|
val DELEGATION_IN_INTERFACE by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Unresolved") {
|
val UNRESOLVED by object : DiagnosticGroup("Unresolved") {
|
||||||
val HIDDEN by error<FirSourceElement, PsiElement> {
|
val HIDDEN by error<FirSourceElement, PsiElement> {
|
||||||
parameter<AbstractFirBasedSymbol<*>>("hidden")
|
parameter<AbstractFirBasedSymbol<*>>("hidden")
|
||||||
}
|
}
|
||||||
@@ -59,7 +59,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val NO_THIS by error<FirSourceElement, PsiElement>()
|
val NO_THIS by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Super") {
|
val SUPER by object : DiagnosticGroup("Super") {
|
||||||
val SUPER_IS_NOT_AN_EXPRESSION by error<FirSourceElement, PsiElement>()
|
val SUPER_IS_NOT_AN_EXPRESSION by error<FirSourceElement, PsiElement>()
|
||||||
val SUPER_NOT_AVAILABLE by error<FirSourceElement, PsiElement>()
|
val SUPER_NOT_AVAILABLE by error<FirSourceElement, PsiElement>()
|
||||||
val ABSTRACT_SUPER_CALL by error<FirSourceElement, PsiElement>()
|
val ABSTRACT_SUPER_CALL by error<FirSourceElement, PsiElement>()
|
||||||
@@ -68,7 +68,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Supertypes") {
|
val SUPERTYPES by object : DiagnosticGroup("Supertypes") {
|
||||||
val TYPE_PARAMETER_AS_SUPERTYPE by error<FirSourceElement, PsiElement>()
|
val TYPE_PARAMETER_AS_SUPERTYPE by error<FirSourceElement, PsiElement>()
|
||||||
val ENUM_AS_SUPERTYPE by error<FirSourceElement, PsiElement>()
|
val ENUM_AS_SUPERTYPE by error<FirSourceElement, PsiElement>()
|
||||||
val RECURSION_IN_SUPERTYPES by error<FirSourceElement, PsiElement>()
|
val RECURSION_IN_SUPERTYPES by error<FirSourceElement, PsiElement>()
|
||||||
@@ -84,7 +84,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error<FirSourceElement, PsiElement>()
|
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group(" Constructor problems") {
|
val CONSTRUCTOR_PROBLEMS by object : DiagnosticGroup("Constructor problems") {
|
||||||
val CONSTRUCTOR_IN_OBJECT by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
val CONSTRUCTOR_IN_OBJECT by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||||
val CONSTRUCTOR_IN_INTERFACE by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
val CONSTRUCTOR_IN_INTERFACE by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||||
val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error<FirSourceElement, PsiElement>()
|
val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error<FirSourceElement, PsiElement>()
|
||||||
@@ -98,7 +98,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val SEALED_CLASS_CONSTRUCTOR_CALL by error<FirSourceElement, PsiElement>()
|
val SEALED_CLASS_CONSTRUCTOR_CALL by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Annotations") {
|
val ANNOTATIONS by object : DiagnosticGroup("Annotations") {
|
||||||
val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error<FirSourceElement, KtExpression>()
|
val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error<FirSourceElement, KtExpression>()
|
||||||
val ANNOTATION_ARGUMENT_MUST_BE_CONST by error<FirSourceElement, KtExpression>()
|
val ANNOTATION_ARGUMENT_MUST_BE_CONST by error<FirSourceElement, KtExpression>()
|
||||||
val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error<FirSourceElement, KtExpression>()
|
val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error<FirSourceElement, KtExpression>()
|
||||||
@@ -116,7 +116,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val VAR_ANNOTATION_PARAMETER by error<FirSourceElement, KtParameter>(PositioningStrategy.VAL_OR_VAR_NODE)
|
val VAR_ANNOTATION_PARAMETER by error<FirSourceElement, KtParameter>(PositioningStrategy.VAL_OR_VAR_NODE)
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Exposed visibility group") {
|
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
|
||||||
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
||||||
val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val EXPOSED_TYPE_PARAMETER_BOUND by exposedVisibilityError<KtTypeReference>()
|
val EXPOSED_TYPE_PARAMETER_BOUND by exposedVisibilityError<KtTypeReference>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Modifiers") {
|
val MODIFIERS by object : DiagnosticGroup("Modifiers") {
|
||||||
val INAPPLICABLE_INFIX_MODIFIER by error<FirSourceElement, PsiElement>()
|
val INAPPLICABLE_INFIX_MODIFIER by error<FirSourceElement, PsiElement>()
|
||||||
val REPEATED_MODIFIER by error<FirSourceElement, PsiElement> {
|
val REPEATED_MODIFIER by error<FirSourceElement, PsiElement> {
|
||||||
parameter<KtModifierKeywordToken>("modifier")
|
parameter<KtModifierKeywordToken>("modifier")
|
||||||
@@ -148,7 +148,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val REDUNDANT_OPEN_IN_INTERFACE by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OPEN_MODIFIER)
|
val REDUNDANT_OPEN_IN_INTERFACE by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OPEN_MODIFIER)
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Applicability") {
|
val APPLICABILITY by object : DiagnosticGroup("Applicability") {
|
||||||
val NONE_APPLICABLE by error<FirSourceElement, PsiElement> {
|
val NONE_APPLICABLE by error<FirSourceElement, PsiElement> {
|
||||||
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
||||||
}
|
}
|
||||||
@@ -161,7 +161,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Ambiguity") {
|
val AMBIGUIRY by object : DiagnosticGroup("Ambiguity") {
|
||||||
val AMBIGUITY by error<FirSourceElement, PsiElement> {
|
val AMBIGUITY by error<FirSourceElement, PsiElement> {
|
||||||
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Types & type parameters") {
|
val TYPES_AND_TYPE_PARAMETERS by object : DiagnosticGroup("Types & type parameters") {
|
||||||
val TYPE_MISMATCH by error<FirSourceElement, PsiElement> {
|
val TYPE_MISMATCH by error<FirSourceElement, PsiElement> {
|
||||||
parameter<ConeKotlinType>("expectedType")
|
parameter<ConeKotlinType>("expectedType")
|
||||||
parameter<ConeKotlinType>("actualType")
|
parameter<ConeKotlinType>("actualType")
|
||||||
@@ -203,7 +203,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS by error<FirSourceElement, KtClassOrObject>(PositioningStrategy.DECLARATION_NAME)
|
val INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS by error<FirSourceElement, KtClassOrObject>(PositioningStrategy.DECLARATION_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
group("overrides") {
|
val OVERRIDES by object : DiagnosticGroup("overrides") {
|
||||||
val NOTHING_TO_OVERRIDE by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OVERRIDE_MODIFIER) {
|
val NOTHING_TO_OVERRIDE by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OVERRIDE_MODIFIER) {
|
||||||
parameter<FirMemberDeclaration>("declaration")
|
parameter<FirMemberDeclaration>("declaration")
|
||||||
}
|
}
|
||||||
@@ -242,7 +242,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Redeclarations") {
|
val REDECLARATIONS by object : DiagnosticGroup("Redeclarations") {
|
||||||
val MANY_COMPANION_OBJECTS by error<FirSourceElement, PsiElement>()
|
val MANY_COMPANION_OBJECTS by error<FirSourceElement, PsiElement>()
|
||||||
val CONFLICTING_OVERLOADS by error<FirSourceElement, PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
|
val CONFLICTING_OVERLOADS by error<FirSourceElement, PsiElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
|
||||||
parameter<Collection<AbstractFirBasedSymbol<*>>>("conflictingOverloads")
|
parameter<Collection<AbstractFirBasedSymbol<*>>>("conflictingOverloads")
|
||||||
@@ -253,7 +253,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error<FirSourceElement, PsiElement>()
|
val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Invalid local declarations") {
|
val INVALID_LOCAL_DECLARATIONS by object : DiagnosticGroup("Invalid local declarations") {
|
||||||
val LOCAL_OBJECT_NOT_ALLOWED by error<FirSourceElement, KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME) {
|
val LOCAL_OBJECT_NOT_ALLOWED by error<FirSourceElement, KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME) {
|
||||||
parameter<Name>("objectName")
|
parameter<Name>("objectName")
|
||||||
}
|
}
|
||||||
@@ -262,7 +262,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Functions") {
|
val FUNCTIONS by object : DiagnosticGroup("Functions") {
|
||||||
val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error<FirSourceElement, KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
|
val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error<FirSourceElement, KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
|
||||||
parameter<FirMemberDeclaration>("function")
|
parameter<FirMemberDeclaration>("function")
|
||||||
parameter<FirMemberDeclaration>("containingClass") // TODO use FirClass instead of FirMemberDeclaration
|
parameter<FirMemberDeclaration>("containingClass") // TODO use FirClass instead of FirMemberDeclaration
|
||||||
@@ -288,7 +288,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val USELESS_VARARG_ON_PARAMETER by warning<FirSourceElement, KtParameter>()
|
val USELESS_VARARG_ON_PARAMETER by warning<FirSourceElement, KtParameter>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Properties & accessors") {
|
val PROPERTIES_ANS_ACCESSORS by object : DiagnosticGroup("Properties & accessors") {
|
||||||
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER) {
|
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER) {
|
||||||
parameter<FirMemberDeclaration>("property")
|
parameter<FirMemberDeclaration>("property")
|
||||||
parameter<FirMemberDeclaration>("containingClass") // TODO use FirClass instead of FirMemberDeclaration
|
parameter<FirMemberDeclaration>("containingClass") // TODO use FirClass instead of FirMemberDeclaration
|
||||||
@@ -314,14 +314,15 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val EXPECTED_PRIVATE_DECLARATION by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER)
|
val EXPECTED_PRIVATE_DECLARATION by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER)
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Multi-platform projects") {
|
val MPP_PROJECTS by object : DiagnosticGroup("Multi-platform projects") {
|
||||||
val EXPECTED_DECLARATION_WITH_BODY by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
val EXPECTED_DECLARATION_WITH_BODY by error<FirSourceElement, KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||||
val EXPECTED_PROPERTY_INITIALIZER by error<FirSourceElement, KtExpression>()
|
val EXPECTED_PROPERTY_INITIALIZER by error<FirSourceElement, KtExpression>()
|
||||||
|
|
||||||
// TODO: need to cover `by` as well as delegate expression
|
// TODO: need to cover `by` as well as delegate expression
|
||||||
val EXPECTED_DELEGATED_PROPERTY by error<FirSourceElement, KtPropertyDelegate>()
|
val EXPECTED_DELEGATED_PROPERTY by error<FirSourceElement, KtPropertyDelegate>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Destructuring declaration") {
|
val DESTRUCTING_DECLARATION by object : DiagnosticGroup("Destructuring declaration") {
|
||||||
val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error<FirSourceElement, KtDestructuringDeclaration>()
|
val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error<FirSourceElement, KtDestructuringDeclaration>()
|
||||||
val COMPONENT_FUNCTION_MISSING by error<FirSourceElement, PsiElement> {
|
val COMPONENT_FUNCTION_MISSING by error<FirSourceElement, PsiElement> {
|
||||||
parameter<Name>("missingFunctionName")
|
parameter<Name>("missingFunctionName")
|
||||||
@@ -339,7 +340,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
// TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ...
|
// TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ...
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Control flow diagnostics") {
|
val CONTROL_FLOW by object : DiagnosticGroup("Control flow diagnostics") {
|
||||||
val UNINITIALIZED_VARIABLE by error<FirSourceElement, PsiElement> {
|
val UNINITIALIZED_VARIABLE by error<FirSourceElement, PsiElement> {
|
||||||
parameter<FirPropertySymbol>("variable")
|
parameter<FirPropertySymbol>("variable")
|
||||||
}
|
}
|
||||||
@@ -354,7 +355,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
val WRONG_IMPLIES_CONDITION by warning<FirSourceElement, PsiElement>()
|
val WRONG_IMPLIES_CONDITION by warning<FirSourceElement, PsiElement>()
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Nullability") {
|
val NULLABILITY by object : DiagnosticGroup("Nullability") {
|
||||||
val UNSAFE_CALL by error<FirSourceElement, PsiElement>(PositioningStrategy.DOT_BY_SELECTOR) {
|
val UNSAFE_CALL by error<FirSourceElement, PsiElement>(PositioningStrategy.DOT_BY_SELECTOR) {
|
||||||
parameter<ConeKotlinType>("receiverType")
|
parameter<ConeKotlinType>("receiverType")
|
||||||
}
|
}
|
||||||
@@ -374,20 +375,20 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
// TODO: val UNEXPECTED_SAFE_CALL by ...
|
// TODO: val UNEXPECTED_SAFE_CALL by ...
|
||||||
}
|
}
|
||||||
|
|
||||||
group("When expressions") {
|
val WHNE_EXPRESSIONS by object : DiagnosticGroup("When expressions") {
|
||||||
val NO_ELSE_IN_WHEN by error<FirSourceElement, KtWhenExpression>(PositioningStrategy.WHEN_EXPRESSION) {
|
val NO_ELSE_IN_WHEN by error<FirSourceElement, KtWhenExpression>(PositioningStrategy.WHEN_EXPRESSION) {
|
||||||
parameter<List<WhenMissingCase>>("missingWhenCases")
|
parameter<List<WhenMissingCase>>("missingWhenCases")
|
||||||
}
|
}
|
||||||
val INVALID_IF_AS_EXPRESSION by error<FirSourceElement, KtIfExpression>(PositioningStrategy.IF_EXPRESSION)
|
val INVALID_IF_AS_EXPRESSION by error<FirSourceElement, KtIfExpression>(PositioningStrategy.IF_EXPRESSION)
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Function contracts") {
|
val FUNCTION_CONTRACTS by object : DiagnosticGroup("Function contracts") {
|
||||||
val ERROR_IN_CONTRACT_DESCRIPTION by error<FirSourceElement, KtElement> {
|
val ERROR_IN_CONTRACT_DESCRIPTION by error<FirSourceElement, KtElement> {
|
||||||
parameter<String>("reason")
|
parameter<String>("reason")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group("Extended checkers") {
|
val EXTENDED_CHECKERS by object : DiagnosticGroup("Extended checkers") {
|
||||||
val REDUNDANT_VISIBILITY_MODIFIER by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER)
|
val REDUNDANT_VISIBILITY_MODIFIER by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER)
|
||||||
val REDUNDANT_MODALITY_MODIFIER by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER)
|
val REDUNDANT_MODALITY_MODIFIER by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER)
|
||||||
val REDUNDANT_RETURN_UNIT_TYPE by warning<FirSourceElement, PsiTypeElement>()
|
val REDUNDANT_RETURN_UNIT_TYPE by warning<FirSourceElement, PsiTypeElement>()
|
||||||
@@ -407,7 +408,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <reified P : PsiElement> DiagnosticListBuilder.exposedVisibilityError(
|
private inline fun <reified P : PsiElement> DiagnosticGroup.exposedVisibilityError(
|
||||||
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
|
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
|
||||||
) = error<FirSourceElement, P>(positioningStrategy) {
|
) = error<FirSourceElement, P>(positioningStrategy) {
|
||||||
parameter<FirEffectiveVisibility>("elementVisibility")
|
parameter<FirEffectiveVisibility>("elementVisibility")
|
||||||
|
|||||||
+2
-2
@@ -91,7 +91,7 @@ object FirErrors {
|
|||||||
val SEALED_SUPERTYPE by error0<FirSourceElement, PsiElement>()
|
val SEALED_SUPERTYPE by error0<FirSourceElement, PsiElement>()
|
||||||
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error0<FirSourceElement, PsiElement>()
|
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error0<FirSourceElement, PsiElement>()
|
||||||
|
|
||||||
// Constructor problems
|
// Constructor problems
|
||||||
val CONSTRUCTOR_IN_OBJECT by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
val CONSTRUCTOR_IN_OBJECT by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||||
val CONSTRUCTOR_IN_INTERFACE by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
val CONSTRUCTOR_IN_INTERFACE by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||||
val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error0<FirSourceElement, PsiElement>()
|
val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error0<FirSourceElement, PsiElement>()
|
||||||
@@ -119,7 +119,7 @@ object FirErrors {
|
|||||||
val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error0<FirSourceElement, KtTypeReference>()
|
val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error0<FirSourceElement, KtTypeReference>()
|
||||||
val VAR_ANNOTATION_PARAMETER by error0<FirSourceElement, KtParameter>(SourceElementPositioningStrategies.VAL_OR_VAR_NODE)
|
val VAR_ANNOTATION_PARAMETER by error0<FirSourceElement, KtParameter>(SourceElementPositioningStrategies.VAL_OR_VAR_NODE)
|
||||||
|
|
||||||
// Exposed visibility group
|
// Exposed visibility
|
||||||
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||||
val EXPOSED_FUNCTION_RETURN_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
val EXPOSED_FUNCTION_RETURN_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||||
val EXPOSED_RECEIVER_TYPE by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
|
val EXPOSED_RECEIVER_TYPE by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ import kotlin.reflect.full.isSubclassOf
|
|||||||
|
|
||||||
object HLDiagnosticConverter {
|
object HLDiagnosticConverter {
|
||||||
fun convert(diagnosticList: DiagnosticList): HLDiagnosticList =
|
fun convert(diagnosticList: DiagnosticList): HLDiagnosticList =
|
||||||
HLDiagnosticList(diagnosticList.diagnostics.map(::convertDiagnostic))
|
HLDiagnosticList(diagnosticList.allDiagnostics.map(::convertDiagnostic))
|
||||||
|
|
||||||
private fun convertDiagnostic(diagnostic: DiagnosticData): HLDiagnostic =
|
private fun convertDiagnostic(diagnostic: DiagnosticData): HLDiagnostic =
|
||||||
HLDiagnostic(
|
HLDiagnostic(
|
||||||
|
|||||||
Reference in New Issue
Block a user