Unresolved reference not reported on data class constructor @get annotation (KT-19628)
This commit is contained in:
+14
-2
@@ -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
@@ -0,0 +1,3 @@
|
||||
$TESTDATA_DIR$/kt19628_12.kt
|
||||
-language-version
|
||||
1.2
|
||||
+10
@@ -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
@@ -0,0 +1 @@
|
||||
OK
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
$TESTDATA_DIR$/kt19628_13.kt
|
||||
-language-version
|
||||
1.3
|
||||
+10
@@ -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
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
$TESTDATA_DIR$/kt19628_progressive.kt
|
||||
-Xprogressive
|
||||
@@ -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 = ""
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user