Refactor JavaPropertyResolver and PropertyPsiData
This commit is contained in:
+20
-18
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+57
-17
@@ -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;
|
||||||
|
|||||||
+4
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user