Refactoring: extract more methods
This commit is contained in:
+153
-112
@@ -88,76 +88,37 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
|
|
||||||
Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
|
Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
|
||||||
|
|
||||||
int regularProperitesCount = 0;
|
int regularPropertiesCount = getNumberOfNonExtensionProperties(map);
|
||||||
for (GroupingValue members : map.values()) {
|
|
||||||
if (!members.ext) {
|
|
||||||
++regularProperitesCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (GroupingValue members : map.values()) {
|
for (GroupingValue members : map.values()) {
|
||||||
|
|
||||||
// we cannot have more then one property with given name even if java code
|
// we cannot have more then one property with given name even if java code
|
||||||
// has several fields, getters and setter of different types
|
// has several fields, getters and setter of different types
|
||||||
if (!members.ext && regularProperitesCount > 1) {
|
if (!members.ext && regularPropertiesCount > 1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isFinal;
|
boolean isFinal = isPropertyFinal(scopeData, members);
|
||||||
if (!scopeData.kotlin) {
|
boolean isVar = isPropertyVar(members);
|
||||||
isFinal = true;
|
|
||||||
}
|
|
||||||
else if (members.setter == null && members.getter == null) {
|
|
||||||
isFinal = false;
|
|
||||||
}
|
|
||||||
else if (members.getter != null) {
|
|
||||||
isFinal = members.getter.getMember().isFinal();
|
|
||||||
}
|
|
||||||
else if (members.setter != null) {
|
|
||||||
isFinal = members.setter.getMember().isFinal();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
isFinal = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
PropertyAccessorData anyMember;
|
PropertyAccessorData characteristicMember = getCharacteristicMember(members);
|
||||||
if (members.getter != null) {
|
|
||||||
anyMember = members.getter;
|
|
||||||
}
|
|
||||||
else if (members.field != null) {
|
|
||||||
anyMember = members.field;
|
|
||||||
}
|
|
||||||
else if (members.setter != null) {
|
|
||||||
anyMember = members.setter;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isVar;
|
Visibility visibility = JavaDescriptorResolver.resolveVisibility(characteristicMember.getMember().psiMember, null);
|
||||||
if (members.getter == null && members.setter == null) {
|
|
||||||
isVar = !members.field.getMember().isFinal();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
isVar = members.setter != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Visibility visibility = JavaDescriptorResolver.resolveVisibility(anyMember.getMember().psiMember, null);
|
|
||||||
CallableMemberDescriptor.Kind kind = CallableMemberDescriptor.Kind.DECLARATION;
|
CallableMemberDescriptor.Kind kind = CallableMemberDescriptor.Kind.DECLARATION;
|
||||||
|
|
||||||
if (members.getter != null && members.getter.getMember() instanceof PsiMethodWrapper) {
|
if (members.getter != null && members.getter.getMember() instanceof PsiMethodWrapper) {
|
||||||
JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getter.getMember()).getJetMethod();
|
JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getter.getMember()).getJetMethod();
|
||||||
visibility = JavaDescriptorResolver.resolveVisibility(anyMember.getMember().psiMember, jetMethod);
|
visibility = JavaDescriptorResolver.resolveVisibility(characteristicMember.getMember().psiMember, jetMethod);
|
||||||
kind = DescriptorKindUtils.flagsToKind(jetMethod.kind());
|
kind = DescriptorKindUtils.flagsToKind(jetMethod.kind());
|
||||||
}
|
}
|
||||||
|
|
||||||
DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, anyMember.getMember().isStatic());
|
DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, characteristicMember.getMember().isStatic());
|
||||||
|
|
||||||
boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner);
|
boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner);
|
||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
realOwner,
|
realOwner,
|
||||||
javaDescriptorResolver.resolveAnnotations(anyMember.getMember().psiMember),
|
javaDescriptorResolver.resolveAnnotations(characteristicMember.getMember().psiMember),
|
||||||
JavaDescriptorResolver.resolveModality(anyMember.getMember(), isFinal || isEnumEntry),
|
JavaDescriptorResolver.resolveModality(characteristicMember.getMember(), isFinal || isEnumEntry),
|
||||||
visibility,
|
visibility,
|
||||||
isVar,
|
isVar,
|
||||||
propertyName,
|
propertyName,
|
||||||
@@ -179,6 +140,7 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
|
|
||||||
PropertyGetterDescriptor getterDescriptor = null;
|
PropertyGetterDescriptor getterDescriptor = null;
|
||||||
PropertySetterDescriptor setterDescriptor = null;
|
PropertySetterDescriptor setterDescriptor = null;
|
||||||
|
|
||||||
if (members.getter != null) {
|
if (members.getter != null) {
|
||||||
getterDescriptor = new PropertyGetterDescriptor(
|
getterDescriptor = new PropertyGetterDescriptor(
|
||||||
propertyDescriptor,
|
propertyDescriptor,
|
||||||
@@ -189,12 +151,14 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
false,
|
false,
|
||||||
kind);
|
kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (members.setter != null) {
|
if (members.setter != null) {
|
||||||
Visibility setterVisibility = JavaDescriptorResolver.resolveVisibility(members.setter.getMember().psiMember, null);
|
Visibility setterVisibility = JavaDescriptorResolver.resolveVisibility(members.setter.getMember().psiMember, null);
|
||||||
if (members.setter.getMember() instanceof PsiMethodWrapper) {
|
if (members.setter.getMember() instanceof PsiMethodWrapper) {
|
||||||
setterVisibility = JavaDescriptorResolver.resolveVisibility(members.setter.getMember().psiMember,
|
setterVisibility = JavaDescriptorResolver.resolveVisibility(
|
||||||
((PsiMethodWrapper) members.setter.getMember())
|
members.setter.getMember().psiMember,
|
||||||
.getJetMethod());
|
((PsiMethodWrapper) members.setter.getMember())
|
||||||
|
.getJetMethod());
|
||||||
}
|
}
|
||||||
setterDescriptor = new PropertySetterDescriptor(
|
setterDescriptor = new PropertySetterDescriptor(
|
||||||
propertyDescriptor,
|
propertyDescriptor,
|
||||||
@@ -208,50 +172,13 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
|
|
||||||
propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
|
propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
|
||||||
|
|
||||||
List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
|
List<TypeParameterDescriptor> typeParameters = resolvePropertyTypeParameters(members, characteristicMember, propertyDescriptor);
|
||||||
|
|
||||||
if (members.setter != null) {
|
TypeVariableResolver typeVariableResolverForPropertyInternals = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
|
||||||
PsiMethodWrapper method = (PsiMethodWrapper) members.setter.getMember();
|
typeParameters, propertyDescriptor, "property " + propertyName + " in " + context);
|
||||||
|
|
||||||
if (anyMember == members.setter) {
|
JetType propertyType = getPropertyType(members, characteristicMember, typeVariableResolverForPropertyInternals);
|
||||||
typeParameters = javaDescriptorSignatureResolver.resolveMethodTypeParameters(method, propertyDescriptor);
|
JetType receiverType = getReceiverType(characteristicMember, typeVariableResolverForPropertyInternals);
|
||||||
}
|
|
||||||
}
|
|
||||||
if (members.getter != null) {
|
|
||||||
PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();
|
|
||||||
|
|
||||||
if (anyMember == members.getter) {
|
|
||||||
typeParameters = javaDescriptorSignatureResolver.resolveMethodTypeParameters(method, propertyDescriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TypeVariableResolver typeVariableResolverForPropertyInternals = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, propertyDescriptor, "property " + propertyName + " in " + context);
|
|
||||||
|
|
||||||
JetType propertyType;
|
|
||||||
if (anyMember.getType().getTypeString().length() > 0) {
|
|
||||||
propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
|
|
||||||
if (JavaDescriptorResolver.findAnnotation(anyMember.getType().getPsiNotNullOwner(), JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
|
|
||||||
propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
|
|
||||||
}
|
|
||||||
else if (members.getter == null && members.setter == null && members.field.getMember().isFinal() && members.field.getMember().isStatic()) {
|
|
||||||
// http://youtrack.jetbrains.com/issue/KT-1388
|
|
||||||
propertyType = TypeUtils.makeNotNullable(propertyType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JetType receiverType;
|
|
||||||
if (anyMember.getReceiverType() == null) {
|
|
||||||
receiverType = null;
|
|
||||||
}
|
|
||||||
else if (anyMember.getReceiverType().getTypeString().length() > 0) {
|
|
||||||
receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
|
|
||||||
}
|
|
||||||
|
|
||||||
propertyDescriptor.setType(
|
propertyDescriptor.setType(
|
||||||
propertyType,
|
propertyType,
|
||||||
@@ -263,17 +190,24 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
getterDescriptor.initialize(propertyType);
|
getterDescriptor.initialize(propertyType);
|
||||||
}
|
}
|
||||||
if (setterDescriptor != null) {
|
if (setterDescriptor != null) {
|
||||||
setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), Name.identifier("p0") /*TODO*/, false, propertyDescriptor.getType(), false, null));
|
setterDescriptor.initialize(new ValueParameterDescriptorImpl(
|
||||||
|
setterDescriptor,
|
||||||
|
0,
|
||||||
|
Collections.<AnnotationDescriptor>emptyList(),
|
||||||
|
Name.identifier("p0") /*TODO*/,
|
||||||
|
false,
|
||||||
|
propertyDescriptor.getType(),
|
||||||
|
false,
|
||||||
|
null));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kind == CallableMemberDescriptor.Kind.DECLARATION) {
|
if (kind == CallableMemberDescriptor.Kind.DECLARATION) {
|
||||||
trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
|
trace.record(BindingContext.VARIABLE, characteristicMember.getMember().psiMember, propertyDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
propertiesFromCurrent.add(propertyDescriptor);
|
propertiesFromCurrent.add(propertyDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName);
|
Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName);
|
||||||
|
|
||||||
final Set<PropertyDescriptor> properties = Sets.newHashSet();
|
final Set<PropertyDescriptor> properties = Sets.newHashSet();
|
||||||
@@ -281,22 +215,22 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
if (owner instanceof ClassDescriptor) {
|
if (owner instanceof ClassDescriptor) {
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) owner;
|
ClassDescriptor classDescriptor = (ClassDescriptor) owner;
|
||||||
|
|
||||||
OverrideResolver
|
OverrideResolver.generateOverridesInFunctionGroup(
|
||||||
.generateOverridesInFunctionGroup(propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor,
|
propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor,
|
||||||
new OverrideResolver.DescriptorSink() {
|
new OverrideResolver.DescriptorSink() {
|
||||||
@Override
|
@Override
|
||||||
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
|
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
|
||||||
properties.add((PropertyDescriptor) fakeOverride);
|
properties.add((PropertyDescriptor) fakeOverride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void conflict(
|
public void conflict(
|
||||||
@NotNull CallableMemberDescriptor fromSuper,
|
@NotNull CallableMemberDescriptor fromSuper,
|
||||||
@NotNull CallableMemberDescriptor fromCurrent
|
@NotNull CallableMemberDescriptor fromCurrent
|
||||||
) {
|
) {
|
||||||
// nop
|
// nop
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
OverrideResolver.resolveUnknownVisibilities(properties, trace);
|
OverrideResolver.resolveUnknownVisibilities(properties, trace);
|
||||||
@@ -305,6 +239,113 @@ public final class JavaDescriptorPropertiesResolver {
|
|||||||
namedMembers.propertyDescriptors = Sets.<VariableDescriptor>newHashSet(properties);
|
namedMembers.propertyDescriptors = Sets.<VariableDescriptor>newHashSet(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<TypeParameterDescriptor> resolvePropertyTypeParameters(
|
||||||
|
@NotNull GroupingValue members,
|
||||||
|
@NotNull PropertyAccessorData characteristicMember,
|
||||||
|
@NotNull PropertyDescriptor propertyDescriptor
|
||||||
|
) {
|
||||||
|
// TODO: Can't get type parameters from field - only from accessors
|
||||||
|
if (characteristicMember == members.setter || characteristicMember == members.getter) {
|
||||||
|
PsiMethodWrapper method = (PsiMethodWrapper) characteristicMember.getMember();
|
||||||
|
return javaDescriptorSignatureResolver.resolveMethodTypeParameters(method, propertyDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private JetType getPropertyType(
|
||||||
|
GroupingValue members,
|
||||||
|
PropertyAccessorData characteristicMember,
|
||||||
|
TypeVariableResolver typeVariableResolverForPropertyInternals
|
||||||
|
) {
|
||||||
|
JetType propertyType;
|
||||||
|
if (!characteristicMember.getType().getTypeString().isEmpty()) {
|
||||||
|
propertyType = semanticServices.getTypeTransformer().transformToType(characteristicMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
propertyType = semanticServices.getTypeTransformer().transformToType(characteristicMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
|
||||||
|
if (JavaDescriptorResolver.findAnnotation(characteristicMember.getType().getPsiNotNullOwner(),
|
||||||
|
JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
|
||||||
|
propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
|
||||||
|
}
|
||||||
|
else if (members.getter == null && members.setter == null && members.field.getMember().isFinal() && members.field.getMember().isStatic()) {
|
||||||
|
// http://youtrack.jetbrains.com/issue/KT-1388
|
||||||
|
propertyType = TypeUtils.makeNotNullable(propertyType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return propertyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JetType getReceiverType(
|
||||||
|
PropertyAccessorData characteristicMember,
|
||||||
|
TypeVariableResolver typeVariableResolverForPropertyInternals
|
||||||
|
) {
|
||||||
|
JetType receiverType;
|
||||||
|
if (characteristicMember.getReceiverType() == null) {
|
||||||
|
receiverType = null;
|
||||||
|
}
|
||||||
|
else if (characteristicMember.getReceiverType().getTypeString().length() > 0) {
|
||||||
|
receiverType = semanticServices.getTypeTransformer().transformToType(characteristicMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
receiverType = semanticServices.getTypeTransformer().transformToType(characteristicMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
|
||||||
|
}
|
||||||
|
return receiverType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getNumberOfNonExtensionProperties(Map<String, GroupingValue> map) {
|
||||||
|
int regularPropertiesCount = 0;
|
||||||
|
for (GroupingValue members : map.values()) {
|
||||||
|
if (!members.ext) {
|
||||||
|
++regularPropertiesCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return regularPropertiesCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static PropertyAccessorData getCharacteristicMember(GroupingValue members) {
|
||||||
|
if (members.getter != null) {
|
||||||
|
return members.getter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (members.field != null) {
|
||||||
|
return members.field;
|
||||||
|
}
|
||||||
|
else if (members.setter != null) {
|
||||||
|
return members.setter;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isPropertyVar(GroupingValue members) {
|
||||||
|
if (members.getter == null && members.setter == null) {
|
||||||
|
return !members.field.getMember().isFinal();
|
||||||
|
}
|
||||||
|
return members.setter != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isPropertyFinal(ResolverScopeData scopeData, GroupingValue propertyGrouping) {
|
||||||
|
boolean isFinal;
|
||||||
|
if (!scopeData.kotlin) {
|
||||||
|
isFinal = true;
|
||||||
|
}
|
||||||
|
else if (propertyGrouping.setter == null && propertyGrouping.getter == null) {
|
||||||
|
isFinal = false;
|
||||||
|
}
|
||||||
|
else if (propertyGrouping.getter != null) {
|
||||||
|
isFinal = propertyGrouping.getter.getMember().isFinal();
|
||||||
|
}
|
||||||
|
else if (propertyGrouping.setter != null) {
|
||||||
|
isFinal = propertyGrouping.setter.getMember().isFinal();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isFinal = false;
|
||||||
|
}
|
||||||
|
return isFinal;
|
||||||
|
}
|
||||||
|
|
||||||
private static Set<PropertyDescriptor> getPropertiesFromSupertypes(ResolverScopeData scopeData, Name propertyName) {
|
private static Set<PropertyDescriptor> getPropertiesFromSupertypes(ResolverScopeData scopeData, Name propertyName) {
|
||||||
Set<PropertyDescriptor> r = new HashSet<PropertyDescriptor>();
|
Set<PropertyDescriptor> r = new HashSet<PropertyDescriptor>();
|
||||||
for (JetType supertype : JavaDescriptorResolver.getSupertypes(scopeData)) {
|
for (JetType supertype : JavaDescriptorResolver.getSupertypes(scopeData)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user