diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 724265f1702..5f5867b955f 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -214,11 +214,10 @@ public class JetSourceNavigationHelper { DefaultModuleConfiguration.createStandardConfiguration(project), providerFactory); - JetTypeReference receiverType = navigationStrategy.getReceiverType(decompiledDeclaration); for (Decl candidate : candidates) { //noinspection unchecked Descr candidateDescriptor = (Descr) resolveSession.resolveToDescriptor(candidate); - if (receiversMatch(receiverType, candidateDescriptor.getReceiverParameter()) + if (receiversMatch(navigationStrategy, decompiledDeclaration, candidateDescriptor) && valueParametersTypesMatch(navigationStrategy, decompiledDeclaration, candidateDescriptor) && typeParametersMatch((JetTypeParameterListOwner) decompiledDeclaration, candidateDescriptor.getTypeParameters())) { return candidate; @@ -292,16 +291,10 @@ public class JetSourceNavigationHelper { final @NotNull MemberNavigationStrategy navigationStrategy, @NotNull Collection candidates ) { - final JetTypeReference decompiledReceiver = navigationStrategy.getReceiverType(decompiledDeclaration); - final int decompiledParametersCount = navigationStrategy.getValueParameters(decompiledDeclaration).size(); - return ContainerUtil.filter(candidates, new Condition() { @Override public boolean value(Decl candidate) { - boolean sameReceiverPresence = (navigationStrategy.getReceiverType(candidate) != null) == - (decompiledReceiver != null); - boolean sameParameterCount = navigationStrategy.getValueParameters(candidate).size() == decompiledParametersCount; - return sameReceiverPresence && sameParameterCount; + return sameReceiverPresenceAndParametersCount(navigationStrategy, candidate, decompiledDeclaration); } }); } @@ -312,20 +305,10 @@ public class JetSourceNavigationHelper { final @NotNull MemberNavigationStrategy navigationStrategy, @NotNull Collection candidates ) { - final JetTypeReference decompiledReceiver = navigationStrategy.getReceiverType(decompiledDeclaration); - return ContainerUtil.filter(candidates, new Condition() { @Override public boolean value(Decl candidate) { - if (decompiledReceiver != null) { - JetTypeReference candidateReceiver = navigationStrategy.getReceiverType(candidate); - assert candidateReceiver != null; - if (!MemberMatching.typesHaveSameShortName(decompiledReceiver, candidateReceiver)) { - return false; - } - } - - return MemberMatching.parameterShortTypesMatch(navigationStrategy, candidate, decompiledDeclaration); + return receiverAndParametersShortTypesMatch(navigationStrategy, candidate, decompiledDeclaration); } }); } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java b/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java index 1a660dee12e..c493cb54200 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java @@ -23,7 +23,6 @@ import com.google.common.collect.Sets; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; @@ -41,6 +40,7 @@ import java.util.List; import java.util.Set; public class MemberMatching { + /* DECLARATIONS ROUGH MATCHING */ private static String getTypeShortName(@NotNull JetTypeReference typeReference) { JetTypeElement typeElement = typeReference.getTypeElement(); assert typeElement != null; @@ -77,19 +77,68 @@ public class MemberMatching { }, null); } - static boolean typesHaveSameShortName(@NotNull JetTypeReference a, @NotNull JetTypeReference b) { + private static boolean typesHaveSameShortName(@NotNull JetTypeReference a, @NotNull JetTypeReference b) { return getTypeShortName(a).equals(getTypeShortName(b)); } - static boolean receiversMatch( - @Nullable JetTypeReference receiverTypeRef, - @Nullable ReceiverParameterDescriptor receiverParameter + static boolean sameReceiverPresenceAndParametersCount( + @NotNull MemberNavigationStrategy navigationStrategy, + @NotNull Decl a, + @NotNull Decl b ) { - if (receiverTypeRef == null && receiverParameter == null) { + boolean sameReceiverPresence = (navigationStrategy.getReceiverType(a) == null) == (navigationStrategy.getReceiverType(b) == null); + boolean sameParametersCount = navigationStrategy.getValueParameters(a).size() == navigationStrategy.getValueParameters(b).size(); + return sameReceiverPresence && sameParametersCount; + } + + static boolean receiverAndParametersShortTypesMatch( + @NotNull MemberNavigationStrategy navigationStrategy, + @NotNull Decl a, + @NotNull Decl b + ) { + JetTypeReference aReceiver = navigationStrategy.getReceiverType(a); + JetTypeReference bReceiver = navigationStrategy.getReceiverType(b); + if ((aReceiver == null) != (bReceiver == null)) { + return false; + } + + if (aReceiver != null && !typesHaveSameShortName(aReceiver, bReceiver)) { + return false; + } + + List aParameters = navigationStrategy.getValueParameters(a); + List bParameters = navigationStrategy.getValueParameters(b); + if (aParameters.size() != bParameters.size()) { + return false; + } + for (int i = 0; i < aParameters.size(); i++) { + JetTypeReference aType = aParameters.get(i).getTypeReference(); + JetTypeReference bType = bParameters.get(i).getTypeReference(); + + assert aType != null; + assert bType != null; + + if (!typesHaveSameShortName(aType, bType)) { + return false; + } + } + return true; + } + + + /* DECLARATION AND DESCRIPTOR STRICT MATCHING */ + static boolean receiversMatch( + @NotNull MemberNavigationStrategy navigationStrategy, + @NotNull Decl declaration, + @NotNull CallableDescriptor descriptor + ) { + JetTypeReference declarationReceiver = navigationStrategy.getReceiverType(declaration); + ReceiverParameterDescriptor descriptorReceiver = descriptor.getReceiverParameter(); + if (declarationReceiver == null && descriptorReceiver == null) { return true; } - if (receiverTypeRef != null && receiverParameter != null) { - return receiverTypeRef.getText().equals(DescriptorRenderer.TEXT.renderType(receiverParameter.getType())); + if (declarationReceiver != null && descriptorReceiver != null) { + return declarationReceiver.getText().equals(DescriptorRenderer.TEXT.renderType(descriptorReceiver.getType())); } return false; } @@ -130,30 +179,6 @@ public class MemberMatching { return true; } - static boolean parameterShortTypesMatch( - @NotNull MemberNavigationStrategy navigationStrategy, - @NotNull Decl a, - @NotNull Decl b - ) { - List aParameters = navigationStrategy.getValueParameters(a); - List bParameters = navigationStrategy.getValueParameters(b); - if (aParameters.size() != bParameters.size()) { - return false; - } - for (int i = 0; i < aParameters.size(); i++) { - JetTypeReference aType = aParameters.get(i).getTypeReference(); - JetTypeReference bType = bParameters.get(i).getTypeReference(); - - assert aType != null; - assert bType != null; - - if (!typesHaveSameShortName(aType, bType)) { - return false; - } - } - return true; - } - static boolean typeParametersMatch( @NotNull JetTypeParameterListOwner typeParameterListOwner, @NotNull List typeParameterDescriptors