[Invariant fix] Avoid re-resolving declared descriptors in lazy member scopes

It becomes necessary after scopes/types refinement
Without it being applied the code might fail with slice-rewrite errors

KT-32841
This commit is contained in:
Denis Zharkov
2019-04-01 15:18:07 +03:00
committed by Dmitry Savvinov
parent ab9ff786d7
commit 5c2c7e7776
9 changed files with 104 additions and 28 deletions
@@ -81,10 +81,11 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
@NotNull Visibility newVisibility,
@Nullable PropertyDescriptor original,
@NotNull Kind kind,
@NotNull Name newName
@NotNull Name newName,
@NotNull SourceElement source
) {
return new JavaPropertyDescriptor(
newOwner, getAnnotations(), newModality, newVisibility, isVar(), newName, SourceElement.NO_SOURCE, original,
newOwner, getAnnotations(), newModality, newVisibility, isVar(), newName, source, original,
kind, isStaticFinal,
singleUserData);
}
@@ -90,6 +90,9 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc
@NotNull
CopyBuilder<D> setOriginal(@Nullable CallableMemberDescriptor original);
@NotNull
CopyBuilder<D> setPreserveSourceElement();
@Nullable
D build();
}
@@ -122,6 +122,7 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
CopyBuilder<D> setSignatureChange();
@NotNull
@Override
CopyBuilder<D> setPreserveSourceElement();
@NotNull
@@ -252,6 +252,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private Modality modality = getModality();
private Visibility visibility = getVisibility();
private PropertyDescriptor original = null;
private boolean preserveSourceElement = false;
private Kind kind = getKind();
private TypeSubstitution substitution = TypeSubstitution.EMPTY;
private boolean copyOverrides = true;
@@ -273,6 +274,13 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return this;
}
@NotNull
@Override
public CopyConfiguration setPreserveSourceElement() {
preserveSourceElement = true;
return this;
}
@NotNull
@Override
public CopyConfiguration setModality(@NotNull Modality modality) {
@@ -352,11 +360,19 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return new CopyConfiguration();
}
@NotNull
private SourceElement getSourceToUseForCopy(boolean preserveSource, @Nullable PropertyDescriptor original) {
return preserveSource
? (original != null ? original : getOriginal()).getSource()
: SourceElement.NO_SOURCE;
}
@Nullable
protected PropertyDescriptor doSubstitute(@NotNull CopyConfiguration copyConfiguration) {
PropertyDescriptorImpl substitutedDescriptor = createSubstitutedCopy(
copyConfiguration.owner, copyConfiguration.modality, copyConfiguration.visibility,
copyConfiguration.original, copyConfiguration.kind, copyConfiguration.name);
copyConfiguration.original, copyConfiguration.kind, copyConfiguration.name,
getSourceToUseForCopy(copyConfiguration.preserveSourceElement, copyConfiguration.original));
List<TypeParameterDescriptor> originalTypeParameters =
copyConfiguration.newTypeParameters == null ? getTypeParameters() : copyConfiguration.newTypeParameters;
@@ -486,10 +502,11 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
@NotNull Visibility newVisibility,
@Nullable PropertyDescriptor original,
@NotNull Kind kind,
@NotNull Name newName
@NotNull Name newName,
@NotNull SourceElement source
) {
return new PropertyDescriptorImpl(
newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), newName, kind, SourceElement.NO_SOURCE,
newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), newName, kind, source,
isLateInit(), isConst(), isExpect(), isActual(), isExternal(), isDelegated()
);
}
@@ -164,7 +164,8 @@ class DeserializedPropertyDescriptor(
newVisibility: Visibility,
original: PropertyDescriptor?,
kind: CallableMemberDescriptor.Kind,
newName: Name
newName: Name,
source: SourceElement
): PropertyDescriptorImpl {
return DeserializedPropertyDescriptor(
newOwner, original, annotations, newModality, newVisibility, isVar, newName, kind, isLateInit, isConst, isExternal,