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 af4eda8884b..10ce6a29088 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 @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.google.common.collect.Sets; -import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.java.kt.JetMethodAnnotation; +import org.jetbrains.jet.lang.resolve.java.wrapper.PropertyPsiData; import org.jetbrains.jet.lang.resolve.java.wrapper.PropertyPsiDataElement; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiFieldWrapper; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; @@ -99,13 +99,6 @@ public final class JavaPropertyResolver { "class or namespace " + qualifiedName); } - private static class GroupingValue { - PropertyPsiDataElement getter; - PropertyPsiDataElement setter; - PropertyPsiDataElement field; - boolean ext; - } - @NotNull private Set resolveNamedGroupProperties( @NotNull ClassOrNamespaceDescriptor owner, @@ -114,37 +107,37 @@ public final class JavaPropertyResolver { @NotNull Name propertyName, @NotNull String context ) { - Map map = collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements()); + Map map = PropertyPsiData.collectGroupingValuesFromAccessors(namedMembers.getPropertyPsiDataElements()); Set propertiesFromCurrent = new HashSet(1); int regularPropertiesCount = getNumberOfNonExtensionProperties(map); - for (GroupingValue members : map.values()) { + for (PropertyPsiData members : map.values()) { // we cannot have more then one property with given name even if java code // has several fields, getters and setter of different types - if (!members.ext && regularPropertiesCount > 1) { + if (!members.isExtension() && regularPropertiesCount > 1) { continue; } boolean isFinal = isPropertyFinal(scopeData, members); - boolean isVar = isPropertyVar(members); + boolean isVar = members.isVar(); - PropertyPsiDataElement characteristicMember = getCharacteristicMember(members); + PropertyPsiDataElement characteristicMember = members.getCharacteristicMember(); Visibility visibility = DescriptorResolverUtils.resolveVisibility(characteristicMember.getMember().getPsiMember(), null); CallableMemberDescriptor.Kind kind = CallableMemberDescriptor.Kind.DECLARATION; - if (members.getter != null && members.getter.getMember() instanceof PsiMethodWrapper) { - JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getter.getMember()).getJetMethod(); + if (members.getGetter() != null && members.getGetter().getMember() instanceof PsiMethodWrapper) { + JetMethodAnnotation jetMethod = ((PsiMethodWrapper) members.getGetter().getMember()).getJetMethod(); visibility = DescriptorResolverUtils.resolveVisibility(characteristicMember.getMember().getPsiMember(), jetMethod); kind = DescriptorKindUtils.flagsToKind(jetMethod.kind()); } DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, characteristicMember.getMember().isStatic()); boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner); - boolean isPropertyForNamedObject = members.field != null && JvmAbi.INSTANCE_FIELD.equals(members.field.getMember().getName()); + boolean isPropertyForNamedObject = members.getField() != null && JvmAbi.INSTANCE_FIELD.equals(members.getField().getMember().getName()); PropertyDescriptor propertyDescriptor = new PropertyDescriptor( realOwner, annotationResolver.resolveAnnotations(characteristicMember.getMember().getPsiMember()), @@ -172,10 +165,10 @@ public final class JavaPropertyResolver { PropertyGetterDescriptor getterDescriptor = null; PropertySetterDescriptor setterDescriptor = null; - if (members.getter != null) { + if (members.getGetter() != null) { getterDescriptor = new PropertyGetterDescriptor( propertyDescriptor, - annotationResolver.resolveAnnotations(members.getter.getMember().getPsiMember()), + annotationResolver.resolveAnnotations(members.getGetter().getMember().getPsiMember()), Modality.OPEN, visibility, true, @@ -183,17 +176,17 @@ public final class JavaPropertyResolver { kind); } - if (members.setter != null) { - Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(members.setter.getMember().getPsiMember(), null); - if (members.setter.getMember() instanceof PsiMethodWrapper) { + if (members.getSetter() != null) { + Visibility setterVisibility = DescriptorResolverUtils.resolveVisibility(members.getSetter().getMember().getPsiMember(), null); + if (members.getSetter().getMember() instanceof PsiMethodWrapper) { setterVisibility = DescriptorResolverUtils.resolveVisibility( - members.setter.getMember().getPsiMember(), - ((PsiMethodWrapper) members.setter.getMember()) + members.getSetter().getMember().getPsiMember(), + ((PsiMethodWrapper) members.getSetter().getMember()) .getJetMethod()); } setterDescriptor = new PropertySetterDescriptor( propertyDescriptor, - annotationResolver.resolveAnnotations(members.setter.getMember().getPsiMember()), + annotationResolver.resolveAnnotations(members.getSetter().getMember().getPsiMember()), Modality.OPEN, setterVisibility, true, @@ -298,12 +291,12 @@ public final class JavaPropertyResolver { } private List resolvePropertyTypeParameters( - @NotNull GroupingValue members, + @NotNull PropertyPsiData members, @NotNull PropertyPsiDataElement characteristicMember, @NotNull PropertyDescriptor propertyDescriptor ) { // TODO: Can't get type parameters from field - only from accessors - if (characteristicMember == members.setter || characteristicMember == members.getter) { + if (characteristicMember == members.getSetter() || characteristicMember == members.getGetter()) { PsiMethodWrapper method = (PsiMethodWrapper) characteristicMember.getMember(); return javaSignatureResolver.resolveMethodTypeParameters(method, propertyDescriptor); } @@ -312,7 +305,7 @@ public final class JavaPropertyResolver { } private JetType getPropertyType( - GroupingValue members, + PropertyPsiData members, PropertyPsiDataElement characteristicMember, TypeVariableResolver typeVariableResolverForPropertyInternals ) { @@ -326,7 +319,7 @@ public final class JavaPropertyResolver { JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) { propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false); } - else if (members.getter == null && members.setter == null && members.field.getMember().isFinal() && members.field.getMember().isStatic()) { + else if (members.getGetter() == null && members.getSetter() == null && members.getField().getMember().isFinal() && members.getField().getMember().isStatic()) { // http://youtrack.jetbrains.com/issue/KT-1388 propertyType = TypeUtils.makeNotNullable(propertyType); } @@ -352,50 +345,27 @@ public final class JavaPropertyResolver { return receiverType; } - private static int getNumberOfNonExtensionProperties(Map map) { + private static int getNumberOfNonExtensionProperties(Map map) { int regularPropertiesCount = 0; - for (GroupingValue members : map.values()) { - if (!members.ext) { + for (PropertyPsiData members : map.values()) { + if (!members.isExtension()) { ++regularPropertiesCount; } } return regularPropertiesCount; } - @NotNull - private static PropertyPsiDataElement getCharacteristicMember(GroupingValue members) { - if (members.getter != null) { - return members.getter; - } - - if (members.field != null) { - return members.field; - } - else if (members.setter != null) { - return members.setter; - } - - throw new IllegalStateException(); - } - - private static boolean isPropertyVar(GroupingValue members) { - if (members.getter == null && members.setter == null) { - return !members.field.getMember().isFinal(); - } - return members.setter != null; - } - - private static boolean isPropertyFinal(ResolverScopeData scopeData, GroupingValue members) { + private static boolean isPropertyFinal(ResolverScopeData scopeData, PropertyPsiData members) { if (!scopeData.isKotlin()) { return true; } - if (members.getter != null) { - return members.getter.getMember().isFinal(); + if (members.getGetter() != null) { + return members.getGetter().getMember().isFinal(); } - if (members.setter != null) { - return members.setter.getMember().isFinal(); + if (members.getSetter() != null) { + return members.getSetter().getMember().isFinal(); } return false; @@ -411,24 +381,6 @@ public final class JavaPropertyResolver { return r; } - private static String key(@Nullable TypeSource typeSource) { - if (typeSource == null) { - return ""; - } - else if (typeSource.getTypeString().length() > 0) { - return typeSource.getTypeString(); - } - else { - return typeSource.getPsiType().getPresentableText(); - } - } - - private static String propertyKeyForGrouping(PropertyPsiDataElement propertyAccessor) { - String type = key(propertyAccessor.getType()); - String receiverType = key(propertyAccessor.getReceiverType()); - return Pair.create(type, receiverType).toString(); - } - @NotNull private ClassOrNamespaceDescriptor getRealOwner( @NotNull ClassOrNamespaceDescriptor owner, @@ -449,46 +401,4 @@ public final class JavaPropertyResolver { return owner; } } - - private static Map collectGroupingValuesFromAccessors(List propertyAccessors) { - Map map = new HashMap(); - for (PropertyPsiDataElement propertyAccessor : propertyAccessors) { - String key = propertyKeyForGrouping(propertyAccessor); - - GroupingValue value = map.get(key); - if (value == null) { - value = new GroupingValue(); - value.ext = propertyAccessor.getReceiverType() != null; - map.put(key, value); - } - - if (value.ext && (propertyAccessor.getReceiverType() == null)) { - throw new IllegalStateException("internal error, incorrect key"); - } - - if (propertyAccessor.isGetter()) { - if (value.getter != null) { - throw new IllegalStateException("oops, duplicate key"); - } - value.getter = propertyAccessor; - } - else if (propertyAccessor.isSetter()) { - if (value.setter != null) { - throw new IllegalStateException("oops, duplicate key"); - } - value.setter = propertyAccessor; - } - else if (propertyAccessor.isField()) { - if (value.field != null) { - throw new IllegalStateException("oops, duplicate key"); - } - value.field = propertyAccessor; - } - else { - throw new IllegalStateException(); - } - } - - return map; - } } 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 new file mode 100644 index 00000000000..093f64a080a --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/wrapper/PropertyPsiData.java @@ -0,0 +1,136 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.wrapper; + +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.resolve.java.TypeSource; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class PropertyPsiData { + public static Map collectGroupingValuesFromAccessors(List propertyAccessors) { + Map map = new HashMap(); + for (PropertyPsiDataElement propertyAccessor : propertyAccessors) { + String key = propertyKeyForGrouping(propertyAccessor); + + 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 (value.getter != null) { + throw new IllegalStateException("oops, duplicate key"); + } + value.getter = propertyAccessor; + } + else if (propertyAccessor.isSetter()) { + if (value.setter != null) { + throw new IllegalStateException("oops, duplicate key"); + } + value.setter = propertyAccessor; + } + else if (propertyAccessor.isField()) { + if (value.field != null) { + throw new IllegalStateException("oops, duplicate key"); + } + value.field = propertyAccessor; + } + else { + throw new IllegalStateException(); + } + } + + return map; + } + + private static String propertyKeyForGrouping(PropertyPsiDataElement propertyAccessor) { + String type = key(propertyAccessor.getType()); + String receiverType = key(propertyAccessor.getReceiverType()); + return Pair.create(type, receiverType).toString(); + } + + private static String key(@Nullable TypeSource typeSource) { + if (typeSource == null) { + return ""; + } + else if (typeSource.getTypeString().length() > 0) { + return typeSource.getTypeString(); + } + else { + return typeSource.getPsiType().getPresentableText(); + } + } + + @Nullable + private PropertyPsiDataElement getter = null; + @Nullable + private PropertyPsiDataElement setter = null; + @Nullable + private PropertyPsiDataElement field = null; + boolean isExtension = false; + + @Nullable + public PropertyPsiDataElement getGetter() { + return getter; + } + + @Nullable + public PropertyPsiDataElement getSetter() { + return setter; + } + + @Nullable + public PropertyPsiDataElement getField() { + return field; + } + + public boolean isExtension() { + return isExtension; + } + + @NotNull + public PropertyPsiDataElement getCharacteristicMember() { + if (getter != null) { + return getter; + } + if (field != null) { + return field; + } + if (setter != null) { + return setter; + } + throw new IllegalStateException(); + } + + public boolean isVar() { + if (getter == null && setter == null) { + return !field.getMember().isFinal(); + } + return setter != null; + } +}