K2: Add KtDiagnosticRenderers.CLASS_ID to render ClassId FQNs with dots

KT-MR-13391
This commit is contained in:
Alexey Belkov
2023-12-07 15:52:41 +04:00
committed by Space Team
parent 1766d0e86a
commit f53f92cdd6
8 changed files with 117 additions and 7 deletions
@@ -5290,6 +5290,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/castForFunctionsWithDifferentArities.kt");
}
@Test
@TestMetadata("ClassIdDiagnosticRendering.kt")
public void testClassIdDiagnosticRendering() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/ClassIdDiagnosticRendering.kt");
}
@Test
@TestMetadata("classLiteralForParameter.kt")
public void testClassLiteralForParameter() throws Exception {
@@ -5290,6 +5290,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/castForFunctionsWithDifferentArities.kt");
}
@Test
@TestMetadata("ClassIdDiagnosticRendering.kt")
public void testClassIdDiagnosticRendering() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/ClassIdDiagnosticRendering.kt");
}
@Test
@TestMetadata("classLiteralForParameter.kt")
public void testClassLiteralForParameter() throws Exception {
@@ -0,0 +1,47 @@
FILE: ClassIdDiagnosticRendering.kt
package a.b.c
@R|kotlin/RequiresOptIn|() public final annotation class Marker : R|kotlin/Annotation| {
public constructor(): R|a/b/c/Marker| {
super<R|kotlin/Any|>()
}
}
@R|a/b/c/Marker|() public final class Some : R|kotlin/Any| {
public constructor(): R|a/b/c/Some| {
super<R|kotlin/Any|>()
}
}
public final fun main(): R|kotlin/Unit| {
R|a/b/c/Some.Some|()
}
public final annotation class DummyAnnotation : R|kotlin/Annotation| {
public constructor(): R|a/b/c/DummyAnnotation| {
super<R|kotlin/Any|>()
}
}
@R|kotlin/SubclassOptInRequired|(markerClass = <getClass>(Q|a/b/c/DummyAnnotation|)) public open class IncorrectSubclassOptInArgumentMarker : R|kotlin/Any| {
public constructor(): R|a/b/c/IncorrectSubclassOptInArgumentMarker| {
super<R|kotlin/Any|>()
}
}
internal abstract fun interface StableInterface : R|kotlin/Any| {
@R|a/b/c/Marker|() public abstract fun experimentalMethod(): R|kotlin/Unit|
}
public final fun testOverrides(): R|kotlin/Unit| {
object : R|a/b/c/StableInterface| {
private constructor(): R|a/b/c/<anonymous>| {
super<R|kotlin/Any|>()
}
public open override fun experimentalMethod(): R|kotlin/Unit| {
}
}
}
public final actual typealias TypealiasToKotlinPkg = R|kotlin/Deprecated|
@@ -0,0 +1,33 @@
// WITH_EXTENDED_CHECKERS
package a.b.c
import <!PLATFORM_CLASS_MAPPED_TO_KOTLIN("kotlin.jvm.functions.Function0")!>kotlin.jvm.functions.Function0<!>
@RequiresOptIn
annotation class Marker
@Marker
class Some
fun main() {
<!OPT_IN_USAGE_ERROR("a.b.c.Marker; This declaration needs opt-in. Its usage must be marked with '@a.b.c.Marker' or '@OptIn(a.b.c.Marker::class)'")!>Some<!>()
}
annotation class DummyAnnotation
<!OPT_IN_ARGUMENT_IS_NOT_MARKER("a.b.c.DummyAnnotation")!>@SubclassOptInRequired(DummyAnnotation::class)<!>
open class IncorrectSubclassOptInArgumentMarker
internal fun interface StableInterface {
@Marker
fun experimentalMethod()
}
fun testOverrides() {
object : StableInterface {
override fun <!OPT_IN_OVERRIDE_ERROR("a.b.c.Marker; Base declaration of supertype 'StableInterface' needs opt-in. The declaration override must be annotated with '@a.b.c.Marker' or '@OptIn(a.b.c.Marker::class)'")!>experimentalMethod<!>() {}
}
}
<!NOT_A_MULTIPLATFORM_COMPILATION!>actual<!> typealias TypealiasToKotlinPkg = <!ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION("kotlin.Deprecated")!>kotlin.Deprecated<!>
@@ -5290,6 +5290,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/castForFunctionsWithDifferentArities.kt");
}
@Test
@TestMetadata("ClassIdDiagnosticRendering.kt")
public void testClassIdDiagnosticRendering() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/ClassIdDiagnosticRendering.kt");
}
@Test
@TestMetadata("classLiteralForParameter.kt")
public void testClassLiteralForParameter() throws Exception {
@@ -5290,6 +5290,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/castForFunctionsWithDifferentArities.kt");
}
@Test
@TestMetadata("ClassIdDiagnosticRendering.kt")
public void testClassIdDiagnosticRendering() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/ClassIdDiagnosticRendering.kt");
}
@Test
@TestMetadata("classLiteralForParameter.kt")
public void testClassLiteralForParameter() throws Exception {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics
import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.CLASS_ID
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.COLLECTION
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.EMPTY
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.FUNCTION_PARAMETERS
@@ -890,7 +891,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
map.put(SINGLETON_IN_SUPERTYPE, "Cannot extend an object.")
map.put(NULLABLE_SUPERTYPE, "Supertypes cannot be nullable.")
map.put(REDUNDANT_NULLABLE, "Redundant '?'.")
map.put(PLATFORM_CLASS_MAPPED_TO_KOTLIN, "This class is not recommended for use in Kotlin. Use ''{0}'' instead.", TO_STRING)
map.put(PLATFORM_CLASS_MAPPED_TO_KOTLIN, "This class is not recommended for use in Kotlin. Use ''{0}'' instead.", CLASS_ID)
map.put(MANY_CLASSES_IN_SUPERTYPE_LIST, "Only one class can appear in a supertype list.")
map.put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice.")
map.put(CLASS_IN_SUPERTYPE_FOR_ENUM, "Enum classes cannot extend classes.")
@@ -1049,11 +1050,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
)
// OptIn
map.put(OPT_IN_USAGE, "{1}", TO_STRING, STRING)
map.put(OPT_IN_USAGE_ERROR, "{1}", TO_STRING, STRING)
map.put(OPT_IN_USAGE, "{1}", CLASS_ID, STRING)
map.put(OPT_IN_USAGE_ERROR, "{1}", CLASS_ID, STRING)
map.put(OPT_IN_OVERRIDE, "{1}", TO_STRING, STRING)
map.put(OPT_IN_OVERRIDE_ERROR, "{1}", TO_STRING, STRING)
map.put(OPT_IN_OVERRIDE, "{1}", CLASS_ID, STRING)
map.put(OPT_IN_OVERRIDE_ERROR, "{1}", CLASS_ID, STRING)
map.put(OPT_IN_IS_NOT_ENABLED, "This annotation should be used with the compiler argument '-opt-in=kotlin.RequiresOptIn'.")
map.put(OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION, "This class can only be used as an annotation.")
@@ -1065,7 +1066,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
map.put(
OPT_IN_ARGUMENT_IS_NOT_MARKER,
"Annotation ''{0}'' is not an opt-in requirement marker; therefore, its usage in @OptIn is ignored.",
TO_STRING
CLASS_ID
)
map.put(
OPT_IN_MARKER_WITH_WRONG_TARGET,
@@ -2072,7 +2073,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
map.put(
ACTUAL_TYPEALIAS_TO_SPECIAL_ANNOTATION,
"''actual typealias'' to annotation which affects code compilation can lead to incorrect behavior. Instead, use ''{0}'' annotation directly.",
TO_STRING
CLASS_ID
)
map.put(
ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT,
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.diagnostics
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.diagnostics.rendering.ContextIndependentParameterRenderer
import org.jetbrains.kotlin.diagnostics.rendering.Renderer
import org.jetbrains.kotlin.name.ClassId
object KtDiagnosticRenderers {
val NULLABLE_STRING = Renderer<String?> { it ?: "null" }
@@ -33,6 +34,10 @@ object KtDiagnosticRenderers {
val FUNCTION_PARAMETERS = Renderer { hasValueParameters: Boolean -> if (hasValueParameters) "..." else "" }
val CLASS_ID = Renderer { classId: ClassId ->
classId.asFqNameString()
}
@Suppress("FunctionName")
fun <T> COLLECTION(renderer: ContextIndependentParameterRenderer<T>): ContextIndependentParameterRenderer<Collection<T>> {
return Renderer { list ->