Unresolved reference not reported on data class constructor @get annotation (KT-19628)

This commit is contained in:
Yan Zhulanow
2018-07-17 20:38:52 +03:00
parent 463f8dae6a
commit bda14fcbb2
13 changed files with 131 additions and 10 deletions
@@ -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<AnnotationUseSiteTarget> = 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)
@@ -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);
}
}
}
+3
View File
@@ -0,0 +1,3 @@
$TESTDATA_DIR$/kt19628_12.kt
-language-version
1.2
+10
View File
@@ -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 = ""
}
+1
View File
@@ -0,0 +1 @@
OK
+3
View File
@@ -0,0 +1,3 @@
$TESTDATA_DIR$/kt19628_13.kt
-language-version
1.3
+10
View File
@@ -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 = ""
}
+14
View File
@@ -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
+2
View File
@@ -0,0 +1,2 @@
$TESTDATA_DIR$/kt19628_progressive.kt
-Xprogressive
+10
View File
@@ -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 = ""
}
+13
View File
@@ -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
@@ -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");
@@ -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),