From fca3cbb619785c93826ac4511340956f521b004d Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 31 Oct 2012 18:45:40 +0400 Subject: [PATCH] Refactor JavaPropertyResolver and PropertyPsiData --- .../java/resolver/JavaPropertyResolver.java | 38 +++++----- .../resolve/java/wrapper/PropertyPsiData.java | 74 ++++++++++++++----- .../java/wrapper/PropertyPsiDataElement.java | 4 + 3 files changed, 81 insertions(+), 35 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java index 10ce6a29088..f8d52bb7a11 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java @@ -107,13 +107,13 @@ public final class JavaPropertyResolver { @NotNull Name propertyName, @NotNull String context ) { - Map map = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements()); + Collection psiDataCollection = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements()); Set propertiesFromCurrent = new HashSet(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 map) { + private static int getNumberOfNonExtensionProperties(@NotNull Collection propertyPsiDataCollection) { int regularPropertiesCount = 0; - for (PropertyPsiData members : map.values()) { + for (PropertyPsiData members : propertyPsiDataCollection) { if (!members.isExtension()) { ++regularPropertiesCount; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiData.java index 093f64a080a..0a3e2acb8bf 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiData.java @@ -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 collectGroupingValuesFromAccessors(List propertyAccessors) { + + @NotNull + public static Collection collectGroupingValuesFromAccessors(@NotNull List elements) { Map map = new HashMap(); - 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 elements = null; @Nullable public PropertyPsiDataElement getGetter() { @@ -109,10 +112,41 @@ public final class PropertyPsiData { return field; } + @SuppressWarnings("ConstantConditions") + @NotNull + private Collection 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; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiDataElement.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiDataElement.java index d09eee9b771..e18304b82cc 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiDataElement.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiDataElement.java @@ -71,6 +71,10 @@ public final class PropertyPsiDataElement { return receiverType; } + boolean isExtension() { + return getReceiverType() != null; + } + public boolean isGetter() { return member instanceof PsiMethodWrapper && getter; }