Refactor JavaPropertyResolver and PropertyPsiData
This commit is contained in:
+20
-18
@@ -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;
|
||||
}
|
||||
|
||||
+57
-17
@@ -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;
|
||||
|
||||
+4
@@ -71,6 +71,10 @@ public final class PropertyPsiDataElement {
|
||||
return receiverType;
|
||||
}
|
||||
|
||||
boolean isExtension() {
|
||||
return getReceiverType() != null;
|
||||
}
|
||||
|
||||
public boolean isGetter() {
|
||||
return member instanceof PsiMethodWrapper && getter;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user