Do not publish non fully initialized descriptors
Leaking of a reference (via publishing to binding trace) of not fully initialized object could lead to unpredicted and unexpected NPEs iff some exception (like PCE or InvalidPsiAccess) happens between the publishing and initialization. #KT-57514 #KT-56388 #KT-56364 Merge-request: KT-MR-10052 Merged-by: Vladimir Dolzhenko <Vladimir.Dolzhenko@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
e6b8a09375
commit
451daaa7c5
@@ -1241,7 +1241,6 @@ public class DescriptorResolver {
|
||||
getterType = determineGetterReturnType(
|
||||
scopeForDeclarationResolution, trace, getterDescriptor, getter, propertyTypeIfKnown, inferenceSession
|
||||
);
|
||||
trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor);
|
||||
}
|
||||
else {
|
||||
getterDescriptor = DescriptorFactory.createGetter(
|
||||
@@ -1254,6 +1253,10 @@ public class DescriptorResolver {
|
||||
|
||||
getterDescriptor.initialize(getterType != null ? getterType : VariableTypeAndInitializerResolver.getTypeForPropertyWithoutReturnType(propertyDescriptor.getName().asString()));
|
||||
|
||||
if (getter != null) {
|
||||
trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor);
|
||||
}
|
||||
|
||||
return getterDescriptor;
|
||||
}
|
||||
|
||||
|
||||
@@ -444,8 +444,6 @@ class FunctionDescriptorResolver(
|
||||
constructorDescriptor.isActual = modifierList?.hasActualModifier() == true ||
|
||||
// We don't require 'actual' for constructors of actual annotations
|
||||
classDescriptor.kind == ClassKind.ANNOTATION_CLASS && classDescriptor.isActual
|
||||
if (declarationToTrace is PsiElement)
|
||||
trace.record(BindingContext.CONSTRUCTOR, declarationToTrace, constructorDescriptor)
|
||||
val parameterScope = LexicalWritableScope(
|
||||
scope,
|
||||
constructorDescriptor,
|
||||
@@ -466,6 +464,8 @@ class FunctionDescriptorResolver(
|
||||
if (DescriptorUtils.isAnnotationClass(classDescriptor)) {
|
||||
CompileTimeConstantUtils.checkConstructorParametersType(valueParameters, trace)
|
||||
}
|
||||
if (declarationToTrace is PsiElement)
|
||||
trace.record(BindingContext.CONSTRUCTOR, declarationToTrace, constructorDescriptor)
|
||||
return constructor
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user