Refactor JavaPropertyResolver and PropertyPsiData

This commit is contained in:
Pavel V. Talanov
2012-10-31 18:45:40 +04:00
parent aff0a5cba6
commit fca3cbb619
3 changed files with 81 additions and 35 deletions
@@ -107,13 +107,13 @@ public final class JavaPropertyResolver {
@NotNull Name propertyName, @NotNull Name propertyName,
@NotNull String context @NotNull String context
) { ) {
Map<String, PropertyPsiData> map = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements()); Collection<PropertyPsiData> psiDataCollection = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements());
Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1); Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
int regularPropertiesCount = getNumberOfNonExtensionProperties(map); int regularPropertiesCount = getNumberOfNonExtensionProperties(psiDataCollection);
for (PropertyPsiData members : map.values()) { for (PropertyPsiData members : psiDataCollection) {
// 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
@@ -126,16 +126,17 @@ public final class JavaPropertyResolver {
PropertyPsiDataElement characteristicMember = members.getCharacteristicMember(); PropertyPsiDataElement characteristicMember = members.getCharacteristicMember();
Visibility visibility = DescriptorResolverUtils.resolveVisibility(characteristicMember.getMember().getPsiMember(), null); Visibility visibility = DescriptorResolverUtils.resolveVisibility(members.getCharacteristicPsi(), null);
CallableMemberDescriptor.Kind kind = CallableMemberDescriptor.Kind.DECLARATION; CallableMemberDescriptor.Kind kind = CallableMemberDescriptor.Kind.DECLARATION;
if (members.getGetter() != null && members.getGetter().getMember() instanceof PsiMethodWrapper) { PropertyPsiDataElement getter = members.getGetter();
JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getGetter().getMember()).getJetMethod(); if (getter != null) {
visibility = DescriptorResolverUtils.resolveVisibility(characteristicMember.getMember().getPsiMember(), jetMethod); JetMethodAnnotation jetMethod = ((PsiMethodWrapper) getter.getMember()).getJetMethod();
visibility = DescriptorResolverUtils.resolveVisibility(members.getCharacteristicPsi(), jetMethod);
kind = DescriptorKindUtils.flagsToKind(jetMethod.kind()); kind = DescriptorKindUtils.flagsToKind(jetMethod.kind());
} }
DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, characteristicMember.getMember().isStatic()); DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, members.isStatic());
boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner); boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner);
boolean isPropertyForNamedObject = members.getField() != null && JvmAbi.INSTANCE_FIELD.equals(members.getField().getMember().getName()); boolean isPropertyForNamedObject = members.getField() != null && JvmAbi.INSTANCE_FIELD.equals(members.getField().getMember().getName());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
@@ -165,10 +166,10 @@ public final class JavaPropertyResolver {
PropertyGetterDescriptor getterDescriptor = null; PropertyGetterDescriptor getterDescriptor = null;
PropertySetterDescriptor setterDescriptor = null; PropertySetterDescriptor setterDescriptor = null;
if (members.getGetter() != null) { if (getter != null) {
getterDescriptor = new PropertyGetterDescriptor( getterDescriptor = new PropertyGetterDescriptor(
propertyDescriptor, propertyDescriptor,
annotationResolver.resolveAnnotations(members.getGetter().getMember().getPsiMember()), annotationResolver.resolveAnnotations(getter.getMember().getPsiMember()),
Modality.OPEN, Modality.OPEN,
visibility, visibility,
true, true,
@@ -176,17 +177,18 @@ public final class JavaPropertyResolver {
kind); kind);
} }
if (members.getSetter() != null) { PropertyPsiDataElement setter = members.getSetter();
Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(members.getSetter().getMember().getPsiMember(), null); if (setter != null) {
if (members.getSetter().getMember() instanceof PsiMethodWrapper) { Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(setter.getMember().getPsiMember(), null);
if (setter.getMember() instanceof PsiMethodWrapper) {
setterVisibility = DescriptorResolverUtils.resolveVisibility( setterVisibility = DescriptorResolverUtils.resolveVisibility(
members.getSetter().getMember().getPsiMember(), setter.getMember().getPsiMember(),
((PsiMethodWrapper) members.getSetter().getMember()) ((PsiMethodWrapper) setter.getMember())
.getJetMethod()); .getJetMethod());
} }
setterDescriptor = new PropertySetterDescriptor( setterDescriptor = new PropertySetterDescriptor(
propertyDescriptor, propertyDescriptor,
annotationResolver.resolveAnnotations(members.getSetter().getMember().getPsiMember()), annotationResolver.resolveAnnotations(setter.getMember().getPsiMember()),
Modality.OPEN, Modality.OPEN,
setterVisibility, setterVisibility,
true, true,
@@ -345,9 +347,9 @@ public final class JavaPropertyResolver {
return receiverType; return receiverType;
} }
private static int getNumberOfNonExtensionProperties(Map<String, PropertyPsiData> map) { private static int getNumberOfNonExtensionProperties(@NotNull Collection<PropertyPsiData> propertyPsiDataCollection) {
int regularPropertiesCount = 0; int regularPropertiesCount = 0;
for (PropertyPsiData members : map.values()) { for (PropertyPsiData members : propertyPsiDataCollection) {
if (!members.isExtension()) { if (!members.isExtension()) {
++regularPropertiesCount; ++regularPropertiesCount;
} }
@@ -16,64 +16,66 @@
package org.jetbrains.jet.lang.resolve.java.wrapper; package org.jetbrains.jet.lang.resolve.java.wrapper;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiMember;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.TypeSource; import org.jetbrains.jet.lang.resolve.java.TypeSource;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public final class PropertyPsiData { public final class PropertyPsiData {
public static Map<String, PropertyPsiData> collectGroupingValuesFromAccessors(List<PropertyPsiDataElement> propertyAccessors) {
@NotNull
public static Collection<PropertyPsiData> collectGroupingValuesFromAccessors(@NotNull List<PropertyPsiDataElement> elements) {
Map<String, PropertyPsiData> map = new HashMap<String, PropertyPsiData>(); Map<String, PropertyPsiData> map = new HashMap<String, PropertyPsiData>();
for (PropertyPsiDataElement propertyAccessor : propertyAccessors) { for (PropertyPsiDataElement element : elements) {
String key = propertyKeyForGrouping(propertyAccessor); String key = propertyKeyForGrouping(element);
PropertyPsiData value = map.get(key); PropertyPsiData value = map.get(key);
if (value == null) { if (value == null) {
value = new PropertyPsiData(); value = new PropertyPsiData();
value.isExtension = propertyAccessor.getReceiverType() != null;
map.put(key, value); map.put(key, value);
} }
if (value.isExtension && (propertyAccessor.getReceiverType() == null)) { if (element.isGetter()) {
throw new IllegalStateException("internal error, incorrect key");
}
if (propertyAccessor.isGetter()) {
if (value.getter != null) { if (value.getter != null) {
throw new IllegalStateException("oops, duplicate key"); throw new IllegalStateException("oops, duplicate key");
} }
value.getter = propertyAccessor; value.getter = element;
} }
else if (propertyAccessor.isSetter()) { else if (element.isSetter()) {
if (value.setter != null) { if (value.setter != null) {
throw new IllegalStateException("oops, duplicate key"); throw new IllegalStateException("oops, duplicate key");
} }
value.setter = propertyAccessor; value.setter = element;
} }
else if (propertyAccessor.isField()) { else if (element.isField()) {
if (value.field != null) { if (value.field != null) {
throw new IllegalStateException("oops, duplicate key"); throw new IllegalStateException("oops, duplicate key");
} }
value.field = propertyAccessor; value.field = element;
} }
else { else {
throw new IllegalStateException(); throw new IllegalStateException();
} }
} }
return map; return map.values();
} }
private static String propertyKeyForGrouping(PropertyPsiDataElement propertyAccessor) { @NotNull
private static String propertyKeyForGrouping(@NotNull PropertyPsiDataElement propertyAccessor) {
String type = key(propertyAccessor.getType()); String type = key(propertyAccessor.getType());
String receiverType = key(propertyAccessor.getReceiverType()); String receiverType = key(propertyAccessor.getReceiverType());
return Pair.create(type, receiverType).toString(); return Pair.create(type, receiverType).toString();
} }
@NotNull
private static String key(@Nullable TypeSource typeSource) { private static String key(@Nullable TypeSource typeSource) {
if (typeSource == null) { if (typeSource == null) {
return ""; return "";
@@ -92,7 +94,8 @@ public final class PropertyPsiData {
private PropertyPsiDataElement setter = null; private PropertyPsiDataElement setter = null;
@Nullable @Nullable
private PropertyPsiDataElement field = null; private PropertyPsiDataElement field = null;
boolean isExtension = false; @Nullable
private Collection<PropertyPsiDataElement> elements = null;
@Nullable @Nullable
public PropertyPsiDataElement getGetter() { public PropertyPsiDataElement getGetter() {
@@ -109,10 +112,41 @@ public final class PropertyPsiData {
return field; return field;
} }
@SuppressWarnings("ConstantConditions")
@NotNull
private Collection<PropertyPsiDataElement> getElements() {
if (elements == null) {
elements = Lists.newArrayList();
if (getter != null) {
elements.add(getter);
}
if (setter != null) {
elements.add(setter);
}
if (field != null) {
elements.add(field);
}
assert !elements.isEmpty();
}
return elements;
}
public boolean isExtension() { public boolean isExtension() {
boolean isExtension = getCharacteristicMember().isExtension();
for (PropertyPsiDataElement element : getElements()) {
assert (element.isExtension() == isExtension);
}
return isExtension; return isExtension;
} }
public boolean isStatic() {
boolean isStatic = getCharacteristicMember().getMember().isStatic();
for (PropertyPsiDataElement element : getElements()) {
assert (element.getMember().isStatic() == isStatic);
}
return isStatic;
}
@NotNull @NotNull
public PropertyPsiDataElement getCharacteristicMember() { public PropertyPsiDataElement getCharacteristicMember() {
if (getter != null) { if (getter != null) {
@@ -127,8 +161,14 @@ public final class PropertyPsiData {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@NotNull
public PsiMember getCharacteristicPsi() {
return getCharacteristicMember().getMember().getPsiMember();
}
public boolean isVar() { public boolean isVar() {
if (getter == null && setter == null) { if (getter == null && setter == null) {
assert field != null;
return !field.getMember().isFinal(); return !field.getMember().isFinal();
} }
return setter != null; return setter != null;
@@ -71,6 +71,10 @@ public final class PropertyPsiDataElement {
return receiverType; return receiverType;
} }
boolean isExtension() {
return getReceiverType() != null;
}
public boolean isGetter() { public boolean isGetter() {
return member instanceof PsiMethodWrapper && getter; return member instanceof PsiMethodWrapper && getter;
} }