From 2130164d9b0e952d90b3be4738059e04ae9b6e7d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 25 Oct 2016 16:48:38 +0300 Subject: [PATCH] EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT is now reported on property if accessor is external #KT-9297 Fixed Also fixes EA-89227 --- .../resolve/jvm/checkers/ExternalFunChecker.kt | 8 +++++++- .../diagnostics/tests/ExternalAndAbstract.kt | 9 +++++++++ .../diagnostics/tests/ExternalAndAbstract.txt | 16 ++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/ExternalAndAbstract.kt create mode 100644 compiler/testData/diagnostics/tests/ExternalAndAbstract.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt index ae8af960748..c1131506eb8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclarationWithBody +import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker @@ -40,7 +41,12 @@ class ExternalFunChecker : SimpleDeclarationChecker { } else if (descriptor is CallableMemberDescriptor && descriptor.modality == Modality.ABSTRACT) { - diagnosticHolder.report(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT.on(declaration)) + if (declaration is KtPropertyAccessor) { + diagnosticHolder.report(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT.on(declaration.property)) + } + else { + diagnosticHolder.report(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT.on(declaration)) + } } if (descriptor !is ConstructorDescriptor && declaration is KtDeclarationWithBody && declaration.hasBody()) { diff --git a/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt b/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt new file mode 100644 index 00000000000..ab14f27ecc1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/ExternalAndAbstract.kt @@ -0,0 +1,9 @@ +abstract class A { + abstract val x : Int + external get +} + +interface B { + val x: Int + external get +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/ExternalAndAbstract.txt b/compiler/testData/diagnostics/tests/ExternalAndAbstract.txt new file mode 100644 index 00000000000..0dfc56a2543 --- /dev/null +++ b/compiler/testData/diagnostics/tests/ExternalAndAbstract.txt @@ -0,0 +1,16 @@ +package + +public abstract class A { + public constructor A() + public abstract val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B { + public abstract val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index b917daf5f81..05e1ebbde01 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -247,6 +247,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("ExternalAndAbstract.kt") + public void testExternalAndAbstract() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/ExternalAndAbstract.kt"); + doTest(fileName); + } + @TestMetadata("fileDependencyRecursion.kt") public void testFileDependencyRecursion() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");