[FE 1.0] Report warning about conflict in inherited members from deserialized dependencies
^KT-51194 ^KT-51223 Fixed
This commit is contained in:
committed by
teamcity
parent
c6994768d7
commit
0eb526a8b4
+28
@@ -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 =
|
||||
|
||||
+1
@@ -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}",
|
||||
|
||||
+18
@@ -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"
|
||||
+30
@@ -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"
|
||||
+28
@@ -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")
|
||||
|
||||
+28
@@ -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")
|
||||
|
||||
+28
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user