From bda14fcbb2fb6a57071c8eb45b6940d4473fa4e7 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 17 Jul 2018 20:38:52 +0300 Subject: [PATCH] Unresolved reference not reported on data class constructor `@get` annotation (KT-19628) --- .../annotations/AnnotationSplitter.kt | 16 ++++++- .../kotlin/resolve/BodyResolver.java | 43 +++++++++++++++---- compiler/testData/cli/jvm/kt19628_12.args | 3 ++ compiler/testData/cli/jvm/kt19628_12.kt | 10 +++++ compiler/testData/cli/jvm/kt19628_12.out | 1 + compiler/testData/cli/jvm/kt19628_13.args | 3 ++ compiler/testData/cli/jvm/kt19628_13.kt | 10 +++++ compiler/testData/cli/jvm/kt19628_13.out | 14 ++++++ .../testData/cli/jvm/kt19628_progressive.args | 2 + .../testData/cli/jvm/kt19628_progressive.kt | 10 +++++ .../testData/cli/jvm/kt19628_progressive.out | 13 ++++++ .../kotlin/cli/CliTestGenerated.java | 15 +++++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 13 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/cli/jvm/kt19628_12.args create mode 100644 compiler/testData/cli/jvm/kt19628_12.kt create mode 100644 compiler/testData/cli/jvm/kt19628_12.out create mode 100644 compiler/testData/cli/jvm/kt19628_13.args create mode 100644 compiler/testData/cli/jvm/kt19628_13.kt create mode 100644 compiler/testData/cli/jvm/kt19628_13.out create mode 100644 compiler/testData/cli/jvm/kt19628_progressive.args create mode 100644 compiler/testData/cli/jvm/kt19628_progressive.kt create mode 100644 compiler/testData/cli/jvm/kt19628_progressive.out diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt index 6c02c91e3ee..78c16f897ce 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.AnnotationChecker import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.lazy.LazyEntity import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue @@ -69,7 +70,11 @@ class AnnotationSplitter( fun getTargetSet( parameter: Boolean, isVar: Boolean, hasBackingField: Boolean, hasDelegate: Boolean ): Set = hashSetOf(PROPERTY, PROPERTY_GETTER).apply { - if (parameter) add(CONSTRUCTOR_PARAMETER) + if (parameter) { + add(CONSTRUCTOR_PARAMETER) + add(PROPERTY_GETTER) + add(PROPERTY_SETTER) + } if (hasBackingField) add(FIELD) if (isVar) add(PROPERTY_SETTER) if (hasDelegate) add(PROPERTY_DELEGATE_FIELD) @@ -120,7 +125,10 @@ class AnnotationSplitter( return CompositeAnnotations(targets.map { getAnnotationsForTarget(it) }) } - private inner class LazySplitAnnotations(storageManager: StorageManager, val target: AnnotationUseSiteTarget?) : Annotations { + private inner class LazySplitAnnotations( + storageManager: StorageManager, + val target: AnnotationUseSiteTarget? + ) : Annotations, LazyEntity { private val annotations by storageManager.createLazyValue { val splitAnnotations = this@AnnotationSplitter.splitAnnotations() @@ -130,6 +138,10 @@ class AnnotationSplitter( splitAnnotations.second } + override fun forceResolveAllContents() { + getAllAnnotations() + } + override fun isEmpty() = annotations.isEmpty() override fun hasAnnotation(fqName: FqName) = annotations.hasAnnotation(fqName) override fun findAnnotation(fqName: FqName) = annotations.findAnnotation(fqName) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 8285d19453e..5b77daa6eb3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -690,6 +690,18 @@ public class BodyResolver { PropertyDescriptor descriptor = trace.getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); if (descriptor != null) { ForceResolveUtil.forceResolveAllContents(descriptor.getAnnotations()); + + if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitErroneousExpressionsInAnnotationsWithUseSiteTargets)) { + PropertyGetterDescriptor getterDescriptor = descriptor.getGetter(); + if (getterDescriptor != null) { + ForceResolveUtil.forceResolveAllContents(getterDescriptor.getAnnotations()); + } + + PropertySetterDescriptor setterDescriptor = descriptor.getSetter(); + if (setterDescriptor != null) { + ForceResolveUtil.forceResolveAllContents(setterDescriptor.getAnnotations()); + } + } } } } @@ -780,18 +792,33 @@ public class BodyResolver { KtPropertyAccessor getter = property.getGetter(); PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter(); - if (getter != null && getterDescriptor != null) { - LexicalScope accessorScope = makeScopeForPropertyAccessor(c, getter, propertyDescriptor); - ForceResolveUtil.forceResolveAllContents(getterDescriptor.getAnnotations()); - resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, getter, getterDescriptor, accessorScope); + + boolean forceResolveAnnotations = + languageVersionSettings.supportsFeature(LanguageFeature.ProhibitErroneousExpressionsInAnnotationsWithUseSiteTargets); + + if (getterDescriptor != null) { + if (getter != null || forceResolveAnnotations) { + ForceResolveUtil.forceResolveAllContents(getterDescriptor.getAnnotations()); + } + + if (getter != null) { + LexicalScope accessorScope = makeScopeForPropertyAccessor(c, getter, propertyDescriptor); + resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, getter, getterDescriptor, accessorScope); + } } KtPropertyAccessor setter = property.getSetter(); PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); - if (setter != null && setterDescriptor != null) { - LexicalScope accessorScope = makeScopeForPropertyAccessor(c, setter, propertyDescriptor); - ForceResolveUtil.forceResolveAllContents(setterDescriptor.getAnnotations()); - resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope); + + if (setterDescriptor != null) { + if (setter != null || forceResolveAnnotations) { + ForceResolveUtil.forceResolveAllContents(setterDescriptor.getAnnotations()); + } + + if (setter != null) { + LexicalScope accessorScope = makeScopeForPropertyAccessor(c, setter, propertyDescriptor); + resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope); + } } } diff --git a/compiler/testData/cli/jvm/kt19628_12.args b/compiler/testData/cli/jvm/kt19628_12.args new file mode 100644 index 00000000000..8aaec38681b --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_12.args @@ -0,0 +1,3 @@ +$TESTDATA_DIR$/kt19628_12.kt +-language-version +1.2 \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_12.kt b/compiler/testData/cli/jvm/kt19628_12.kt new file mode 100644 index 00000000000..0c4067323b2 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_12.kt @@ -0,0 +1,10 @@ +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + +@Suppress("ANNOTATION_TARGETS_NON_EXISTENT_ACCESSOR") +class Data( + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + var value: String? +) { + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + private val b: String = "" +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_12.out b/compiler/testData/cli/jvm/kt19628_12.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_12.out @@ -0,0 +1 @@ +OK diff --git a/compiler/testData/cli/jvm/kt19628_13.args b/compiler/testData/cli/jvm/kt19628_13.args new file mode 100644 index 00000000000..17e353ec157 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_13.args @@ -0,0 +1,3 @@ +$TESTDATA_DIR$/kt19628_13.kt +-language-version +1.3 \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_13.kt b/compiler/testData/cli/jvm/kt19628_13.kt new file mode 100644 index 00000000000..0c4067323b2 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_13.kt @@ -0,0 +1,10 @@ +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + +@Suppress("ANNOTATION_TARGETS_NON_EXISTENT_ACCESSOR") +class Data( + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + var value: String? +) { + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + private val b: String = "" +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_13.out b/compiler/testData/cli/jvm/kt19628_13.out new file mode 100644 index 00000000000..b18ffbb7a97 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_13.out @@ -0,0 +1,14 @@ +warning: language version 1.3 is experimental, there are no backwards compatibility guarantees for new language and library features +compiler/testData/cli/jvm/kt19628_13.kt:5:29: error: unresolved reference: CollapsedStringAdapter + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_13.kt:5:29: error: an annotation argument must be a compile-time constant + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_13.kt:8:29: error: unresolved reference: CollapsedStringAdapter + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_13.kt:8:29: error: an annotation argument must be a compile-time constant + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/kt19628_progressive.args b/compiler/testData/cli/jvm/kt19628_progressive.args new file mode 100644 index 00000000000..d45251d98ce --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_progressive.args @@ -0,0 +1,2 @@ +$TESTDATA_DIR$/kt19628_progressive.kt +-Xprogressive \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_progressive.kt b/compiler/testData/cli/jvm/kt19628_progressive.kt new file mode 100644 index 00000000000..0c4067323b2 --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_progressive.kt @@ -0,0 +1,10 @@ +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + +@Suppress("ANNOTATION_TARGETS_NON_EXISTENT_ACCESSOR") +class Data( + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + var value: String? +) { + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + private val b: String = "" +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/kt19628_progressive.out b/compiler/testData/cli/jvm/kt19628_progressive.out new file mode 100644 index 00000000000..405e99446ab --- /dev/null +++ b/compiler/testData/cli/jvm/kt19628_progressive.out @@ -0,0 +1,13 @@ +compiler/testData/cli/jvm/kt19628_progressive.kt:5:29: error: unresolved reference: CollapsedStringAdapter + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_progressive.kt:5:29: error: an annotation argument must be a compile-time constant + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_progressive.kt:8:29: error: unresolved reference: CollapsedStringAdapter + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +compiler/testData/cli/jvm/kt19628_progressive.kt:8:29: error: an annotation argument must be a compile-time constant + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + ^ +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 6e504187c81..67e2b5af661 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -396,6 +396,21 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/kotlinPackage.args"); } + @TestMetadata("kt19628_12.args") + public void testKt19628_12() throws Exception { + runTest("compiler/testData/cli/jvm/kt19628_12.args"); + } + + @TestMetadata("kt19628_13.args") + public void testKt19628_13() throws Exception { + runTest("compiler/testData/cli/jvm/kt19628_13.args"); + } + + @TestMetadata("kt19628_progressive.args") + public void testKt19628_progressive() throws Exception { + runTest("compiler/testData/cli/jvm/kt19628_progressive.args"); + } + @TestMetadata("kt22304.args") public void testKt22304() throws Exception { runTest("compiler/testData/cli/jvm/kt22304.args"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index d6e8406703b..9ca771cfa98 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -87,6 +87,7 @@ enum class LanguageFeature( SoundSmartcastForEnumEntries(KOTLIN_1_3, kind = BUG_FIX), SoundSmartcastFromLoopConditionForLoopAssignedVariables(KOTLIN_1_3, kind = BUG_FIX), DslMarkerOnFunctionTypeReceiver(KOTLIN_1_4, kind = BUG_FIX), + ProhibitErroneousExpressionsInAnnotationsWithUseSiteTargets(KOTLIN_1_3, kind = BUG_FIX), RestrictReturnStatementTarget(KOTLIN_1_4, kind = BUG_FIX), ProperIeee754Comparisons(sinceVersion = null, defaultState = State.DISABLED, kind = BUG_FIX),