Preserve JavaPropertyDescriptor type in substitution/copy

JavaPropertyDescriptor.substitute should return JavaPropertyDescriptor,
similarly to what's happening in JavaMethodDescriptor
This commit is contained in:
Alexander Udalov
2016-03-02 13:22:25 +03:00
parent 371051b1d6
commit 6429dd4b04
4 changed files with 53 additions and 26 deletions
@@ -32,7 +32,8 @@ import java.util.List;
public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements JavaCallableMemberDescriptor { public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements JavaCallableMemberDescriptor {
private final boolean isStaticFinal; private final boolean isStaticFinal;
public JavaPropertyDescriptor(
protected JavaPropertyDescriptor(
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull Annotations annotations, @NotNull Annotations annotations,
@NotNull Modality modality, @NotNull Modality modality,
@@ -41,14 +42,46 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
@NotNull Name name, @NotNull Name name,
@NotNull SourceElement source, @NotNull SourceElement source,
@Nullable PropertyDescriptor original, @Nullable PropertyDescriptor original,
@NotNull Kind kind,
boolean isStaticFinal boolean isStaticFinal
) { ) {
super(containingDeclaration, original, annotations, modality, visibility, isVar, name, Kind.DECLARATION, source, super(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source,
/* lateInit = */ false, /* isConst = */ false); /* lateInit = */ false, /* isConst = */ false);
this.isStaticFinal = isStaticFinal; this.isStaticFinal = isStaticFinal;
} }
@NotNull
public static JavaPropertyDescriptor create(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull Annotations annotations,
@NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar,
@NotNull Name name,
@NotNull SourceElement source,
boolean isStaticFinal
) {
return new JavaPropertyDescriptor(
containingDeclaration, annotations, modality, visibility, isVar, name, source, null, Kind.DECLARATION, isStaticFinal
);
}
@NotNull
@Override
protected PropertyDescriptorImpl createSubstitutedCopy(
@NotNull DeclarationDescriptor newOwner,
@NotNull Modality newModality,
@NotNull Visibility newVisibility,
@Nullable PropertyDescriptor original,
@NotNull Kind kind
) {
return new JavaPropertyDescriptor(
newOwner, getAnnotations(), newModality, newVisibility, isVar(), getName(), SourceElement.NO_SOURCE, original,
kind, isStaticFinal
);
}
@Override @Override
public boolean hasSynthesizedParameterNames() { public boolean hasSynthesizedParameterNames() {
return false; return false;
@@ -70,6 +103,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
getName(), getName(),
getSource(), getSource(),
getOriginal(), getOriginal(),
getKind(),
isStaticFinal isStaticFinal
); );
@@ -385,9 +385,9 @@ class LazyJavaClassMemberScope(
): JavaPropertyDescriptor { ): JavaPropertyDescriptor {
val annotations = c.resolveAnnotations(method) val annotations = c.resolveAnnotations(method)
val propertyDescriptor = JavaPropertyDescriptor( val propertyDescriptor = JavaPropertyDescriptor.create(
ownerDescriptor, annotations, modality, method.getVisibility(), ownerDescriptor, annotations, modality, method.visibility,
/* isVar = */ false, method.name, c.components.sourceElementFactory.source(method), /* original */ null, /* isVar = */ false, method.name, c.components.sourceElementFactory.source(method),
/* isStaticFinal = */ false /* isStaticFinal = */ false
) )
@@ -419,10 +419,9 @@ class LazyJavaClassMemberScope(
"for getter is ${getterMethod.modality}, but for setter is ${setterMethod?.modality}" "for getter is ${getterMethod.modality}, but for setter is ${setterMethod?.modality}"
} }
val propertyDescriptor = JavaPropertyDescriptor( val propertyDescriptor = JavaPropertyDescriptor.create(
ownerDescriptor, Annotations.EMPTY, getterMethod.modality, getterMethod.visibility, ownerDescriptor, Annotations.EMPTY, getterMethod.modality, getterMethod.visibility,
/* isVar = */ setterMethod != null, overriddenProperty.name, getterMethod.source, /* isVar = */ setterMethod != null, overriddenProperty.name, getterMethod.source,
/* original */ null,
/* isStaticFinal = */ false /* isStaticFinal = */ false
) )
@@ -265,12 +265,12 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS
private fun createPropertyDescriptor(field: JavaField): PropertyDescriptorImpl { private fun createPropertyDescriptor(field: JavaField): PropertyDescriptorImpl {
val isVar = !field.isFinal val isVar = !field.isFinal
val visibility = field.visibility
val annotations = c.resolveAnnotations(field) val annotations = c.resolveAnnotations(field)
val propertyName = field.name
return JavaPropertyDescriptor(ownerDescriptor, annotations, Modality.FINAL, visibility, isVar, propertyName, return JavaPropertyDescriptor.create(
c.components.sourceElementFactory.source(field), /* original = */ null, /*isConst= */ field.isFinalStatic) ownerDescriptor, annotations, Modality.FINAL, field.visibility, isVar, field.name,
c.components.sourceElementFactory.source(field), /* isConst = */ field.isFinalStatic
)
} }
private val JavaField.isFinalStatic: Boolean private val JavaField.isFinalStatic: Boolean
@@ -29,7 +29,10 @@ import org.jetbrains.kotlin.types.TypeSubstitutor;
import org.jetbrains.kotlin.types.Variance; import org.jetbrains.kotlin.types.Variance;
import org.jetbrains.kotlin.utils.SmartSet; import org.jetbrains.kotlin.utils.SmartSet;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns;
@@ -210,7 +213,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
} }
@Nullable @Nullable
private PropertyDescriptor doSubstitute( protected PropertyDescriptor doSubstitute(
@NotNull TypeSubstitutor originalSubstitutor, @NotNull TypeSubstitutor originalSubstitutor,
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@NotNull Modality newModality, @NotNull Modality newModality,
@@ -322,19 +325,10 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
@Nullable PropertyDescriptor original, @Nullable PropertyDescriptor original,
@NotNull Kind kind @NotNull Kind kind
) { ) {
return new PropertyDescriptorImpl(newOwner, original, return new PropertyDescriptorImpl(
getAnnotations(), newModality, newVisibility, newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, SourceElement.NO_SOURCE,
isVar(), getName(), kind, SourceElement.NO_SOURCE, isLateInit(), isConst()); isLateInit(), isConst()
} );
@NotNull
private static Visibility convertVisibility(Visibility orig, Visibility candidate) {
if (candidate == Visibilities.INHERITED) {
return candidate;
}
Integer result = Visibilities.compare(orig, candidate);
return result != null && result < 0 ? candidate : orig;
} }
@Override @Override