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 String context
) {
Map<String, PropertyPsiData> map = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements());
Collection<PropertyPsiData> psiDataCollection = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements());
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
// has several fields, getters and setter of different types
@@ -126,16 +126,17 @@ public final class JavaPropertyResolver {
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;
if (members.getGetter() != null && members.getGetter().getMember() instanceof PsiMethodWrapper) {
JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getGetter().getMember()).getJetMethod();
visibility = DescriptorResolverUtils.resolveVisibility(characteristicMember.getMember().getPsiMember(), jetMethod);
PropertyPsiDataElement getter = members.getGetter();
if (getter != null) {
JetMethodAnnotation jetMethod = ((PsiMethodWrapper) getter.getMember()).getJetMethod();
visibility = DescriptorResolverUtils.resolveVisibility(members.getCharacteristicPsi(), jetMethod);
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 isPropertyForNamedObject = members.getField() != null && JvmAbi.INSTANCE_FIELD.equals(members.getField().getMember().getName());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
@@ -165,10 +166,10 @@ public final class JavaPropertyResolver {
PropertyGetterDescriptor getterDescriptor = null;
PropertySetterDescriptor setterDescriptor = null;
if (members.getGetter() != null) {
if (getter != null) {
getterDescriptor = new PropertyGetterDescriptor(
propertyDescriptor,
annotationResolver.resolveAnnotations(members.getGetter().getMember().getPsiMember()),
annotationResolver.resolveAnnotations(getter.getMember().getPsiMember()),
Modality.OPEN,
visibility,
true,
@@ -176,17 +177,18 @@ public final class JavaPropertyResolver {
kind);
}
if (members.getSetter() != null) {
Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(members.getSetter().getMember().getPsiMember(), null);
if (members.getSetter().getMember() instanceof PsiMethodWrapper) {
PropertyPsiDataElement setter = members.getSetter();
if (setter != null) {
Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(setter.getMember().getPsiMember(), null);
if (setter.getMember() instanceof PsiMethodWrapper) {
setterVisibility = DescriptorResolverUtils.resolveVisibility(
members.getSetter().getMember().getPsiMember(),
((PsiMethodWrapper) members.getSetter().getMember())
setter.getMember().getPsiMember(),
((PsiMethodWrapper) setter.getMember())
.getJetMethod());
}
setterDescriptor = new PropertySetterDescriptor(
propertyDescriptor,
annotationResolver.resolveAnnotations(members.getSetter().getMember().getPsiMember()),
annotationResolver.resolveAnnotations(setter.getMember().getPsiMember()),
Modality.OPEN,
setterVisibility,
true,
@@ -345,9 +347,9 @@ public final class JavaPropertyResolver {
return receiverType;
}
private static int getNumberOfNonExtensionProperties(Map<String, PropertyPsiData> map) {
private static int getNumberOfNonExtensionProperties(@NotNull Collection<PropertyPsiData> propertyPsiDataCollection) {
int regularPropertiesCount = 0;
for (PropertyPsiData members : map.values()) {
for (PropertyPsiData members : propertyPsiDataCollection) {
if (!members.isExtension()) {
++regularPropertiesCount;
}
@@ -16,64 +16,66 @@
package org.jetbrains.jet.lang.resolve.java.wrapper;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiMember;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.TypeSource;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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>();
for (PropertyPsiDataElement propertyAccessor : propertyAccessors) {
String key = propertyKeyForGrouping(propertyAccessor);
for (PropertyPsiDataElement element : elements) {
String key = propertyKeyForGrouping(element);
PropertyPsiData value = map.get(key);
if (value == null) {
value = new PropertyPsiData();
value.isExtension = propertyAccessor.getReceiverType() != null;
map.put(key, value);
}
if (value.isExtension && (propertyAccessor.getReceiverType() == null)) {
throw new IllegalStateException("internal error, incorrect key");
}
if (propertyAccessor.isGetter()) {
if (element.isGetter()) {
if (value.getter != null) {
throw new IllegalStateException("oops, duplicate key");
}
value.getter = propertyAccessor;
value.getter = element;
}
else if (propertyAccessor.isSetter()) {
else if (element.isSetter()) {
if (value.setter != null) {
throw new IllegalStateException("oops, duplicate key");
}
value.setter = propertyAccessor;
value.setter = element;
}
else if (propertyAccessor.isField()) {
else if (element.isField()) {
if (value.field != null) {
throw new IllegalStateException("oops, duplicate key");
}
value.field = propertyAccessor;
value.field = element;
}
else {
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 receiverType = key(propertyAccessor.getReceiverType());
return Pair.create(type, receiverType).toString();
}
@NotNull
private static String key(@Nullable TypeSource typeSource) {
if (typeSource == null) {
return "";
@@ -92,7 +94,8 @@ public final class PropertyPsiData {
private PropertyPsiDataElement setter = null;
@Nullable
private PropertyPsiDataElement field = null;
boolean isExtension = false;
@Nullable
private Collection<PropertyPsiDataElement> elements = null;
@Nullable
public PropertyPsiDataElement getGetter() {
@@ -109,10 +112,41 @@ public final class PropertyPsiData {
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() {
boolean isExtension = getCharacteristicMember().isExtension();
for (PropertyPsiDataElement element : getElements()) {
assert (element.isExtension() == isExtension);
}
return isExtension;
}
public boolean isStatic() {
boolean isStatic = getCharacteristicMember().getMember().isStatic();
for (PropertyPsiDataElement element : getElements()) {
assert (element.getMember().isStatic() == isStatic);
}
return isStatic;
}
@NotNull
public PropertyPsiDataElement getCharacteristicMember() {
if (getter != null) {
@@ -127,8 +161,14 @@ public final class PropertyPsiData {
throw new IllegalStateException();
}
@NotNull
public PsiMember getCharacteristicPsi() {
return getCharacteristicMember().getMember().getPsiMember();
}
public boolean isVar() {
if (getter == null && setter == null) {
assert field != null;
return !field.getMember().isFinal();
}
return setter != null;
@@ -71,6 +71,10 @@ public final class PropertyPsiDataElement {
return receiverType;
}
boolean isExtension() {
return getReceiverType() != null;
}
public boolean isGetter() {
return member instanceof PsiMethodWrapper && getter;
}