Prevent unsafe publication of not full initialized instance
#KTIJ-22182
This commit is contained in:
committed by
Space Team
parent
067036c162
commit
a8bef8ac81
@@ -94,7 +94,10 @@ public class AnnotationResolverImpl extends AnnotationResolver {
|
|||||||
for (KtAnnotationEntry entryElement : annotationEntryElements) {
|
for (KtAnnotationEntry entryElement : annotationEntryElements) {
|
||||||
AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement);
|
AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement);
|
||||||
if (descriptor == null) {
|
if (descriptor == null) {
|
||||||
descriptor = new LazyAnnotationDescriptor(new LazyAnnotationsContextImpl(this, storageManager, trace, scope), entryElement);
|
LazyAnnotationDescriptor lazyAnnotationDescriptor =
|
||||||
|
new LazyAnnotationDescriptor(new LazyAnnotationsContextImpl(this, storageManager, trace, scope), entryElement);
|
||||||
|
lazyAnnotationDescriptor.recordToTrace();
|
||||||
|
descriptor = lazyAnnotationDescriptor;
|
||||||
}
|
}
|
||||||
if (shouldResolveArguments) {
|
if (shouldResolveArguments) {
|
||||||
ForceResolveUtil.forceResolveAllContents(descriptor);
|
ForceResolveUtil.forceResolveAllContents(descriptor);
|
||||||
|
|||||||
+5
-5
@@ -60,7 +60,7 @@ class LazyAnnotations(
|
|||||||
override fun isEmpty() = annotationEntries.isEmpty()
|
override fun isEmpty() = annotationEntries.isEmpty()
|
||||||
|
|
||||||
private val annotation = c.storageManager.createMemoizedFunction { entry: KtAnnotationEntry ->
|
private val annotation = c.storageManager.createMemoizedFunction { entry: KtAnnotationEntry ->
|
||||||
c.trace.get(BindingContext.ANNOTATION, entry) ?: LazyAnnotationDescriptor(c, entry)
|
c.trace.get(BindingContext.ANNOTATION, entry) ?: LazyAnnotationDescriptor(c, entry).also { it.recordToTrace() }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun iterator(): Iterator<AnnotationDescriptor> = annotationEntries.asSequence().map(annotation).iterator()
|
override fun iterator(): Iterator<AnnotationDescriptor> = annotationEntries.asSequence().map(annotation).iterator()
|
||||||
@@ -78,10 +78,6 @@ class LazyAnnotationDescriptor(
|
|||||||
val annotationEntry: KtAnnotationEntry
|
val annotationEntry: KtAnnotationEntry
|
||||||
) : AnnotationDescriptor, LazyEntity {
|
) : AnnotationDescriptor, LazyEntity {
|
||||||
|
|
||||||
init {
|
|
||||||
c.trace.record(BindingContext.ANNOTATION, annotationEntry, this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override val type by c.storageManager.createLazyValue(
|
override val type by c.storageManager.createLazyValue(
|
||||||
computable = lazy@{
|
computable = lazy@{
|
||||||
val annotationType = c.annotationResolver.resolveAnnotationType(scope, annotationEntry, c.trace)
|
val annotationType = c.annotationResolver.resolveAnnotationType(scope, annotationEntry, c.trace)
|
||||||
@@ -133,6 +129,10 @@ class LazyAnnotationDescriptor(
|
|||||||
allValueArguments
|
allValueArguments
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun recordToTrace() {
|
||||||
|
c.trace.record(BindingContext.ANNOTATION, annotationEntry, this)
|
||||||
|
}
|
||||||
|
|
||||||
private class FileDescriptorForVisibilityChecks(
|
private class FileDescriptorForVisibilityChecks(
|
||||||
private val source: SourceElement,
|
private val source: SourceElement,
|
||||||
private val containingDeclaration: PackageFragmentDescriptor
|
private val containingDeclaration: PackageFragmentDescriptor
|
||||||
|
|||||||
Reference in New Issue
Block a user