From 05290c3ed22c08649d1fb62a6abc4778a8b0977b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 31 Aug 2017 16:14:44 +0300 Subject: [PATCH] Fix AssertionError on incompatible scopes with impl typealias This has been introduced in 9ecd04f6289247711135837b48f4ab09e089f4d0 --- .../checkers/HeaderImplDeclarationChecker.kt | 9 +++++++-- .../common.kt | 3 +++ .../jvm.kt | 3 +++ .../output.txt | 18 ++++++++++++++++++ .../MultiPlatformIntegrationTestGenerated.java | 6 ++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/common.kt create mode 100644 compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/jvm.kt create mode 100644 compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/output.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt index 804d14e43ab..24325f630ac 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/HeaderImplDeclarationChecker.kt @@ -143,7 +143,9 @@ object HeaderImplDeclarationChecker : DeclarationChecker { // TODO: replace with 'singleOrNull' as soon as multi-module diagnostic tests are refactored val singleIncompatibility = compatibility.keys.firstOrNull() if (singleIncompatibility is Incompatible.ClassScopes) { - assert(descriptor is ClassDescriptor) { "Incompatible.ClassScopes is only possible for a class: $descriptor" } + assert(descriptor is ClassDescriptor || descriptor is TypeAliasDescriptor) { + "Incompatible.ClassScopes is only possible for a class or a typealias: $descriptor" + } // Do not report "header members are not implemented" for those header members, for which there's a clear // (albeit maybe incompatible) single implementation suspect, declared in the impl class. @@ -162,8 +164,11 @@ object HeaderImplDeclarationChecker : DeclarationChecker { val nonTrivialUnimplemented = singleIncompatibility.unimplemented.filterNot(::hasSingleImplSuspect) if (nonTrivialUnimplemented.isNotEmpty()) { + val classDescriptor = + (descriptor as? TypeAliasDescriptor)?.expandedType?.constructor?.declarationDescriptor as? ClassDescriptor + ?: (descriptor as ClassDescriptor) diagnosticHolder.report(Errors.HEADER_CLASS_MEMBERS_ARE_NOT_IMPLEMENTED.on( - reportOn, descriptor as ClassDescriptor, nonTrivialUnimplemented + reportOn, classDescriptor, nonTrivialUnimplemented )) } } diff --git a/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/common.kt b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/common.kt new file mode 100644 index 00000000000..13d87726556 --- /dev/null +++ b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/common.kt @@ -0,0 +1,3 @@ +package test + +header abstract class Writer protected constructor() diff --git a/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/jvm.kt b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/jvm.kt new file mode 100644 index 00000000000..23eb7e686dc --- /dev/null +++ b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/jvm.kt @@ -0,0 +1,3 @@ +package test + +impl typealias Writer = java.io.Writer diff --git a/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/output.txt b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/output.txt new file mode 100644 index 00000000000..d269017c4d2 --- /dev/null +++ b/compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/output.txt @@ -0,0 +1,18 @@ +-- Common -- +Exit code: OK +Output: + +-- JVM -- +Exit code: COMPILATION_ERROR +Output: +compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/jvm.kt:3:1: error: 'impl' class 'Writer' has no implementation of 'header' class members: + + protected constructor Writer() + + The following declaration is incompatible because visibility is different: + protected/*protected and package*/ constructor Writer() + The following declaration is incompatible because number of value parameters is different: + protected/*protected and package*/ constructor Writer(p0: Any!) + +impl typealias Writer = java.io.Writer +^ diff --git a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java index 5ae511958d2..26cf0795928 100644 --- a/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/multiplatform/MultiPlatformIntegrationTestGenerated.java @@ -206,6 +206,12 @@ public class MultiPlatformIntegrationTestGenerated extends AbstractMultiPlatform KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/multiplatform/regressions"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, true); } + @TestMetadata("incompatibleClassScopesWithImplTypeAlias") + public void testIncompatibleClassScopesWithImplTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/regressions/incompatibleClassScopesWithImplTypeAlias/"); + doTest(fileName); + } + @TestMetadata("kt17001") public void testKt17001() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/multiplatform/regressions/kt17001/");