From da7acd5e739e06a479b780f2f17a845ea24cd81f Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 28 Jan 2016 18:16:14 +0300 Subject: [PATCH] Check annotations on default property getter/setter --- .../checkers/JvmSyntheticApplicabilityChecker.kt | 10 +++++++--- .../resolve/jvm/checkers/declarationCheckers.kt | 7 ++++++- .../kotlin/resolve/DeclarationsChecker.kt | 16 ++++++++++------ .../kotlin/resolve/ModifiersChecker.java | 5 ++++- .../kotlin/resolve/UnderscoreChecker.kt | 7 +++---- .../annotationsOnUseSiteTargets.kt | 13 +++++++++++++ .../annotationsOnUseSiteTargets.txt | 11 +++++++++++ .../annotationApplicability/jvmName.kt | 6 ++++++ .../annotationApplicability/jvmName.txt | 7 +++++++ .../DiagnosticsTestWithStdLibGenerated.java | 6 ++++++ 10 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt index de2be9da09a..0f3462b21f8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.jvm.checkers import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtProperty @@ -28,11 +29,14 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm class JvmSyntheticApplicabilityChecker : DeclarationChecker { - override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, - diagnosticHolder: DiagnosticSink, bindingContext: BindingContext + override fun check( + declaration: KtDeclaration, + descriptor: DeclarationDescriptor, + diagnosticHolder: DiagnosticSink, + bindingContext: BindingContext ) { val annotation = descriptor.findJvmSyntheticAnnotation() ?: return - if (declaration is KtProperty && declaration.hasDelegate()) { + if (declaration is KtProperty && descriptor is VariableDescriptor && declaration.hasDelegate()) { val annotationEntry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation) ?: return diagnosticHolder.report(ErrorsJvm.JVM_SYNTHETIC_ON_DELEGATE.on(annotationEntry)) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index 264c8a31ef1..b1ee5f31d2d 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -99,7 +99,12 @@ class PlatformStaticAnnotationChecker : DeclarationChecker { } class JvmNameAnnotationChecker : DeclarationChecker { - override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink, bindingContext: BindingContext) { + override fun check( + declaration: KtDeclaration, + descriptor: DeclarationDescriptor, + diagnosticHolder: DiagnosticSink, + bindingContext: BindingContext + ) { val platformNameAnnotation = DescriptorUtils.getJvmNameAnnotation(descriptor) if (platformNameAnnotation != null) { checkDeclaration(descriptor, platformNameAnnotation, diagnosticHolder) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 47804740a9d..d9102701336 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -727,12 +727,16 @@ class DeclarationsChecker( } private fun checkAccessors(property: KtProperty, propertyDescriptor: PropertyDescriptor) { - for (accessor in property.accessors) { - val propertyAccessorDescriptor = (if (accessor.isGetter) propertyDescriptor.getter else propertyDescriptor.setter) - ?: throw AssertionError("No property accessor descriptor for ${property.text}") - accessor.checkTypeReferences() - modifiersChecker.checkModifiersForDeclaration(accessor, propertyAccessorDescriptor) - identifierChecker.checkDeclaration(accessor, trace) + for (accessorDescriptor in propertyDescriptor.accessors) { + val accessor = if (accessorDescriptor is PropertyGetterDescriptor) property.getter else property.setter + if (accessor != null) { + accessor.checkTypeReferences() + modifiersChecker.checkModifiersForDeclaration(accessor, accessorDescriptor) + identifierChecker.checkDeclaration(accessor, trace) + } + else { + modifiersChecker.runDeclarationCheckers(property, accessorDescriptor) + } } checkAccessor(propertyDescriptor, property.getter, propertyDescriptor.getter) checkAccessor(propertyDescriptor, property.setter, propertyDescriptor.setter) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index 88d4919fb6f..c430fa1d43c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -228,7 +228,10 @@ public class ModifiersChecker { } - private void runDeclarationCheckers(@NotNull KtDeclaration declaration, @NotNull DeclarationDescriptor descriptor) { + public void runDeclarationCheckers( + @NotNull KtDeclaration declaration, + @NotNull DeclarationDescriptor descriptor + ) { for (DeclarationChecker checker : declarationCheckers) { checker.check(declaration, descriptor, trace, trace.getBindingContext()); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt index 4295bf2db75..2392f0edbb6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/UnderscoreChecker.kt @@ -18,12 +18,10 @@ package org.jetbrains.kotlin.resolve import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.psi.KtTypeParameterListOwner +import org.jetbrains.kotlin.psi.* object UnderscoreChecker : DeclarationChecker { @@ -44,6 +42,7 @@ object UnderscoreChecker : DeclarationChecker { diagnosticHolder: DiagnosticSink, bindingContext: BindingContext ) { + if (declaration is KtProperty && descriptor !is VariableDescriptor) return if (declaration is KtCallableDeclaration) { for (parameter in declaration.valueParameters) { checkNamed(parameter, diagnosticHolder) diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.kt new file mode 100644 index 00000000000..30da1567767 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.kt @@ -0,0 +1,13 @@ +interface Test { + @get:JvmStatic + val a: Int + + @get:JvmName("1") + val b: Int + + @get:Synchronized + val c: Int + + @get:JvmOverloads + val d: Int +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.txt new file mode 100644 index 00000000000..32510493af4 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.txt @@ -0,0 +1,11 @@ +package + +public interface Test { + public abstract val a: kotlin.Int + public abstract val b: kotlin.Int + public abstract val c: kotlin.Int + public abstract val d: 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/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt index 0b6a5473a0a..43d299e6f4f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt @@ -86,4 +86,10 @@ class D: AB() { @JvmName("D_finalFun") fun finalFun() {} +} + +interface Intf { + @get:JvmName("getBar") // no error in IDE + @set:JvmName("setBar") // no error in IDE + var foo: Int } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt index 4b742ce2879..15b8600d5b9 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt @@ -43,3 +43,10 @@ public final class D : AB { @kotlin.jvm.JvmName(name = "D_openFun") public final override /*1*/ fun openFun(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } + +public interface Intf { + public abstract var foo: 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/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index c532c40ae9d..e717bb527a0 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -207,6 +207,12 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("annotationsOnUseSiteTargets.kt") + public void testAnnotationsOnUseSiteTargets() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/annotationsOnUseSiteTargets.kt"); + doTest(fileName); + } + @TestMetadata("illegalPlatformName.kt") public void testIllegalPlatformName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.kt");