Preserve original for constructors of LazySubstitutingClassDescriptor
We would like DeclarationDescriptor.getOriginal() to always point to a (preferably unique) unsubstituted descriptors for the given possibly substituted descriptor. In case of LazySubstitutingClassDescriptor (which can be observed for nested generic Java classes), this invariant was broken, because 'getOriginal()' for constructors of substituted class returned a copy created for this particular substituted class.
This commit is contained in:
@@ -27,10 +27,10 @@ interface ClassConstructorDescriptor : ConstructorDescriptor {
|
||||
override fun substitute(substitutor: TypeSubstitutor): ClassConstructorDescriptor?
|
||||
|
||||
override fun copy(
|
||||
newOwner: DeclarationDescriptor,
|
||||
modality: Modality,
|
||||
visibility: Visibility,
|
||||
kind: CallableMemberDescriptor.Kind,
|
||||
copyOverrides: Boolean
|
||||
newOwner: DeclarationDescriptor,
|
||||
modality: Modality,
|
||||
visibility: Visibility,
|
||||
kind: CallableMemberDescriptor.Kind,
|
||||
copyOverrides: Boolean
|
||||
): ClassConstructorDescriptor
|
||||
}
|
||||
+7
-2
@@ -135,8 +135,13 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
|
||||
Collection<ClassConstructorDescriptor> originalConstructors = original.getConstructors();
|
||||
Collection<ClassConstructorDescriptor> result = new ArrayList<ClassConstructorDescriptor>(originalConstructors.size());
|
||||
for (ClassConstructorDescriptor constructor : originalConstructors) {
|
||||
ClassConstructorDescriptor copy =
|
||||
constructor.copy(this, constructor.getModality(), constructor.getVisibility(), constructor.getKind(), false);
|
||||
ClassConstructorDescriptor copy = (ClassConstructorDescriptor) constructor.newCopyBuilder()
|
||||
.setOriginal(constructor.getOriginal())
|
||||
.setModality(constructor.getModality())
|
||||
.setVisibility(constructor.getVisibility())
|
||||
.setKind(constructor.getKind())
|
||||
.setCopyOverrides(false)
|
||||
.build();
|
||||
result.add(copy.substitute(getSubstitutor()));
|
||||
}
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user