[FE 1.0] Report warning about conflict in inherited members from deserialized dependencies

^KT-51194
^KT-51223 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-02-09 14:33:59 +03:00
committed by teamcity
parent c6994768d7
commit 0eb526a8b4
16 changed files with 273 additions and 1 deletions
@@ -15340,6 +15340,34 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@Test
@TestMetadata("kt51194_java.kt")
public void testKt51194_java() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_java.kt");
}
@Test
@TestMetadata("kt51194_javaAndKotlin.kt")
public void testKt51194_javaAndKotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_javaAndKotlin.kt");
}
@Test
@TestMetadata("kt51194_kotlin.kt")
public void testKt51194_kotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_kotlin.kt");
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@@ -597,6 +597,8 @@ public interface Errors {
DiagnosticFactory2<KtClassOrObject, ClassDescriptor, Collection<CallableMemberDescriptor>> CONFLICTING_INHERITED_MEMBERS =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, ClassDescriptor, Collection<CallableMemberDescriptor>> CONFLICTING_INHERITED_MEMBERS_WARNING =
DiagnosticFactory2.create(WARNING, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_MEMBER_NOT_IMPLEMENTED =
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
DiagnosticFactory2<KtClassOrObject, KtClassOrObject, CallableMemberDescriptor> ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED =
@@ -887,6 +887,7 @@ public class DefaultErrorMessages {
FQ_NAMES_IN_TYPES);
MAP.put(CONFLICTING_INHERITED_MEMBERS, "{0} inherits conflicting members: {1}", NAME, CommonRenderers.commaSeparated(FQ_NAMES_IN_TYPES));
MAP.put(CONFLICTING_INHERITED_MEMBERS_WARNING, "{0} inherits conflicting members: {1}; This warning will became error in future releases. See https://youtrack.jetbrains.com/issue/KT-51194", NAME, CommonRenderers.commaSeparated(FQ_NAMES_IN_TYPES));
MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} is not abstract and does not implement abstract member {1}", RENDER_CLASS_OR_OBJECT,
FQ_NAMES_IN_TYPES);
MAP.put(ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED, "{0} is not abstract and does not implement abstract base class member {1}",
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.diagnostics.reportOnDeclarationAs
@@ -254,6 +255,23 @@ open class LazyClassMemberScope(
}
}
})
for (descriptor in result) {
if (descriptor !is FunctionDescriptorImpl) continue
for (overriddenFunction in descriptor.overriddenDescriptors) {
if (overriddenFunction !is FunctionDescriptorImpl) continue
val conflictedDescriptor = overriddenFunction.getUserData(DeserializedDeclarationsFromSupertypeConflictDataKey) ?: continue
reportOnDeclarationAs<KtClassOrObject>(
trace,
thisDescriptor
) { ktClassOrObject ->
Errors.CONFLICTING_INHERITED_MEMBERS_WARNING.on(
ktClassOrObject,
thisDescriptor,
listOf(overriddenFunction, conflictedDescriptor)
)
}
}
}
OverrideResolver.resolveUnknownVisibilities(result, trace)
}
@@ -0,0 +1,29 @@
// TARGET_BACKEND: JVM
// ISSUE: KT-51194
// MODULE: coreLib_1
// FILE: Base.java
public interface Base {
Object foo();
}
// MODULE: lib(coreLib_1)
// FILE: Derived.java
public abstract class Derived implements Base {
@Override
public Object foo() {
return null;
}
}
// MODULE: coreLib_2
// FILE: Base.java
public interface Base {
<T> T foo();
}
// MODULE: main(coreLib_2, lib)
// FILE: main.kt
class Implementation : Derived()
fun box() = "OK"
@@ -0,0 +1,30 @@
// TARGET_BACKEND: JVM
// ISSUE: KT-51194
// DIAGNOSTICS: +CONFLICTING_INHERITED_MEMBERS_WARNING
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: FIR correctly reports CONFLICTING_INHERITED_MEMBERS, so this test should not pass design
// For details see related issue
// MODULE: coreLib_1
// FILE: Base.java
public interface Base {
Object foo();
}
// MODULE: lib(coreLib_1)
// FILE: Derived.kt
abstract class Derived : Base {
override fun foo(): Any? = null
}
// MODULE: coreLib_2
// FILE: Base.java
public interface Base {
<T> T foo();
}
// MODULE: main(coreLib_2, lib)
// FILE: main.kt
<!CONFLICTING_INHERITED_MEMBERS_WARNING!>class Implementation<!> : Derived()
fun box() = "OK"
@@ -0,0 +1,30 @@
// TARGET_BACKEND: JVM
// ISSUE: KT-51194
// DIAGNOSTICS: +CONFLICTING_INHERITED_MEMBERS_WARNING
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: FIR correctly reports CONFLICTING_INHERITED_MEMBERS, so this test should not pass design
// For details see related issue
// MODULE: coreLib_1
// FILE: Base.kt
interface Base {
fun foo(): Any?
}
// MODULE: lib(coreLib_1)
// FILE: Derived.kt
abstract class Derived : Base {
override fun foo(): Any? = null
}
// MODULE: coreLib_2
// FILE: Base.kt
interface Base {
fun <T> foo(): T
}
// MODULE: main(coreLib_2, lib)
// FILE: main.kt
<!CONFLICTING_INHERITED_MEMBERS_WARNING!>class Implementation<!> : Derived()
fun box() = "OK"
@@ -15220,6 +15220,34 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@Test
@TestMetadata("kt51194_java.kt")
public void testKt51194_java() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_java.kt");
}
@Test
@TestMetadata("kt51194_javaAndKotlin.kt")
public void testKt51194_javaAndKotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_javaAndKotlin.kt");
}
@Test
@TestMetadata("kt51194_kotlin.kt")
public void testKt51194_kotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_kotlin.kt");
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@@ -15340,6 +15340,34 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@Test
@TestMetadata("kt51194_java.kt")
public void testKt51194_java() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_java.kt");
}
@Test
@TestMetadata("kt51194_javaAndKotlin.kt")
public void testKt51194_javaAndKotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_javaAndKotlin.kt");
}
@Test
@TestMetadata("kt51194_kotlin.kt")
public void testKt51194_kotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_kotlin.kt");
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@@ -12495,6 +12495,34 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
}
}
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class DifferentDependencyVersion extends AbstractLightAnalysisModeTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
}
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@TestMetadata("kt51194_java.kt")
public void testKt51194_java() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_java.kt");
}
@TestMetadata("kt51194_javaAndKotlin.kt")
public void testKt51194_javaAndKotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_javaAndKotlin.kt");
}
@TestMetadata("kt51194_kotlin.kt")
public void testKt51194_kotlin() throws Exception {
runTest("compiler/testData/codegen/box/differentDependencyVersion/kt51194_kotlin.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -86,3 +86,5 @@ fun DeclarationDescriptor.containingPackage(): FqName? {
require(container is PackageFragmentDescriptor?)
return container?.fqName
}
object DeserializedDeclarationsFromSupertypeConflictDataKey : CallableDescriptor.UserDataKey<CallableMemberDescriptor>
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor
import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -327,7 +328,9 @@ class DeserializedClassDescriptor(
fromSuper: CallableMemberDescriptor,
fromCurrent: CallableMemberDescriptor
) {
// TODO report conflicts
if (fromCurrent is FunctionDescriptorImpl) {
fromCurrent.putInUserDataMap(DeserializedDeclarationsFromSupertypeConflictDataKey, fromSuper)
}
}
})
}
@@ -11766,6 +11766,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true);
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@@ -11808,6 +11808,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@@ -9767,6 +9767,19 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
}
}
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class DifferentDependencyVersion extends AbstractIrCodegenBoxWasmTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest0(this::doTest, TargetBackend.WASM, testDataFilePath);
}
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
}
}
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -12740,6 +12740,18 @@ public class ExternalTestGenerated extends AbstractExternalNativeBlackBoxTest {
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/differentDependencyVersion")
@TestDataPath("$PROJECT_ROOT")
@Tag("external")
@UseExtTestCaseGroupProvider()
public class DifferentDependencyVersion {
@Test
public void testAllFilesPresentInDifferentDependencyVersion() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/differentDependencyVersion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true);
}
}
@Nested
@TestMetadata("compiler/testData/codegen/box/directInvokeOptimization")
@TestDataPath("$PROJECT_ROOT")