From b2dc82f17ef62836ba370ecb249828ec7e352b97 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 11 Oct 2017 20:04:42 +0300 Subject: [PATCH] Improve diagnostic for non-actual declaration with weak incompatibility --- .../kotlin/diagnostics/PositioningStrategies.kt | 2 +- .../diagnostics/rendering/DefaultErrorMessages.java | 2 +- .../kotlin/diagnostics/rendering/Renderers.kt | 11 +++++++++++ .../expectDeclarationWithWeakIncompatibilities.kt | 2 +- .../common.kt | 1 + .../weakIncompatibilityWithoutActualModifier/jvm.kt | 1 + .../output.txt | 13 +++++++++++++ .../MultiPlatformIntegrationTestGenerated.java | 6 ++++++ .../kotlin/idea/highlighter/IdeErrorMessages.java | 4 ++-- 9 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/common.kt create mode 100644 compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt create mode 100644 compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 6d0c6d0a253..52ec4c8880f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index d649d0c152e..e3254693e41 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -284,7 +284,7 @@ public class DefaultErrorMessages { MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual declaration in module{1}{2}", DECLARATION_NAME_WITH_KIND, PLATFORM, PlatformIncompatibilityDiagnosticRenderer.TEXT); - MAP.put(ACTUAL_WITHOUT_EXPECT, "Actual {0} has no corresponding expected declaration{1}", DECLARATION_NAME_WITH_KIND, + MAP.put(ACTUAL_WITHOUT_EXPECT, "{0} has no corresponding expected declaration{1}", CAPITALIZED_DECLARATION_NAME_WITH_KIND_AND_PLATFORM, PlatformIncompatibilityDiagnosticRenderer.TEXT); MAP.put(NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS, "Actual class ''{0}'' has no corresponding members for expected class members:{1}", diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index d015f4f3485..24f5d69bbee 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -108,6 +108,17 @@ object Renderers { } } + @JvmField val CAPITALIZED_DECLARATION_NAME_WITH_KIND_AND_PLATFORM = ContextDependentRenderer { descriptor, context -> + val declarationWithNameAndKind = DECLARATION_NAME_WITH_KIND.render(descriptor, context) + val withPlatform = if (descriptor is MemberDescriptor && descriptor.isActual) + "actual $declarationWithNameAndKind" + else + declarationWithNameAndKind + + withPlatform.capitalize() + } + + @JvmField val NAME_OF_CONTAINING_DECLARATION_OR_FILE = Renderer { if (DescriptorUtils.isTopLevelDeclaration(it) && it is DeclarationDescriptorWithVisibility && it.visibility == Visibilities.PRIVATE) { "file" diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.kt index 460f0af9cf0..183070dd793 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.kt @@ -14,7 +14,7 @@ expect fun foo3(): Int // FILE: jvm.kt -interface Foo1 +interface Foo1 actual interface Foo2 actual fun foo1(): String = "" diff --git a/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/common.kt b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/common.kt new file mode 100644 index 00000000000..357baca20e7 --- /dev/null +++ b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/common.kt @@ -0,0 +1 @@ +expect class Foo \ No newline at end of file diff --git a/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt new file mode 100644 index 00000000000..1258184b652 --- /dev/null +++ b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt @@ -0,0 +1 @@ +interface Foo \ No newline at end of file diff --git a/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt new file mode 100644 index 00000000000..a7c0d10151f --- /dev/null +++ b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt @@ -0,0 +1,13 @@ +-- Common -- +Exit code: OK +Output: + +-- JVM -- +Exit code: COMPILATION_ERROR +Output: +compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt:1:1: error: interface 'Foo' has no corresponding expected declaration +The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation): + public final expect class Foo + +interface Foo +^ diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java index 96bd6b2e328..2457de5d6ee 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java @@ -132,6 +132,12 @@ public class MultiPlatformIntegrationTestGenerated extends AbstractMultiPlatform doTest(fileName); } + @TestMetadata("weakIncompatibilityWithoutActualModifier") + public void testWeakIncompatibilityWithoutActualModifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/"); + doTest(fileName); + } + @TestMetadata("compiler/testData/multiplatform/classScopes") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java index ff0e49c9e70..763fe179d4a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -177,7 +177,7 @@ public class IdeErrorMessages { MAP.put(NO_ACTUAL_FOR_EXPECT, "Expected {0} has no actual declaration in module{1}{2}", DECLARATION_NAME_WITH_KIND, PLATFORM, new PlatformIncompatibilityDiagnosticRenderer(IdeMultiplatformDiagnosticRenderingMode.INSTANCE)); - MAP.put(ACTUAL_WITHOUT_EXPECT, "Actual {0} has no corresponding expected declaration{1}", DECLARATION_NAME_WITH_KIND, + MAP.put(ACTUAL_WITHOUT_EXPECT, "{0} has no corresponding expected declaration{1}", CAPITALIZED_DECLARATION_NAME_WITH_KIND_AND_PLATFORM, new PlatformIncompatibilityDiagnosticRenderer(IdeMultiplatformDiagnosticRenderingMode.INSTANCE)); MAP.put(NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS, "Actual class ''{0}'' has no corresponding members for expected class members:{1}",