Moved the rest of members matching logic to MemberMatching.
This commit is contained in:
@@ -214,11 +214,10 @@ public class JetSourceNavigationHelper {
|
|||||||
DefaultModuleConfiguration.createStandardConfiguration(project),
|
DefaultModuleConfiguration.createStandardConfiguration(project),
|
||||||
providerFactory);
|
providerFactory);
|
||||||
|
|
||||||
JetTypeReference receiverType = navigationStrategy.getReceiverType(decompiledDeclaration);
|
|
||||||
for (Decl candidate : candidates) {
|
for (Decl candidate : candidates) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
Descr candidateDescriptor = (Descr) resolveSession.resolveToDescriptor(candidate);
|
Descr candidateDescriptor = (Descr) resolveSession.resolveToDescriptor(candidate);
|
||||||
if (receiversMatch(receiverType, candidateDescriptor.getReceiverParameter())
|
if (receiversMatch(navigationStrategy, decompiledDeclaration, candidateDescriptor)
|
||||||
&& valueParametersTypesMatch(navigationStrategy, decompiledDeclaration, candidateDescriptor)
|
&& valueParametersTypesMatch(navigationStrategy, decompiledDeclaration, candidateDescriptor)
|
||||||
&& typeParametersMatch((JetTypeParameterListOwner) decompiledDeclaration, candidateDescriptor.getTypeParameters())) {
|
&& typeParametersMatch((JetTypeParameterListOwner) decompiledDeclaration, candidateDescriptor.getTypeParameters())) {
|
||||||
return candidate;
|
return candidate;
|
||||||
@@ -292,16 +291,10 @@ public class JetSourceNavigationHelper {
|
|||||||
final @NotNull MemberNavigationStrategy<Decl, Descr> navigationStrategy,
|
final @NotNull MemberNavigationStrategy<Decl, Descr> navigationStrategy,
|
||||||
@NotNull Collection<Decl> candidates
|
@NotNull Collection<Decl> candidates
|
||||||
) {
|
) {
|
||||||
final JetTypeReference decompiledReceiver = navigationStrategy.getReceiverType(decompiledDeclaration);
|
|
||||||
final int decompiledParametersCount = navigationStrategy.getValueParameters(decompiledDeclaration).size();
|
|
||||||
|
|
||||||
return ContainerUtil.filter(candidates, new Condition<Decl>() {
|
return ContainerUtil.filter(candidates, new Condition<Decl>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean value(Decl candidate) {
|
public boolean value(Decl candidate) {
|
||||||
boolean sameReceiverPresence = (navigationStrategy.getReceiverType(candidate) != null) ==
|
return sameReceiverPresenceAndParametersCount(navigationStrategy, candidate, decompiledDeclaration);
|
||||||
(decompiledReceiver != null);
|
|
||||||
boolean sameParameterCount = navigationStrategy.getValueParameters(candidate).size() == decompiledParametersCount;
|
|
||||||
return sameReceiverPresence && sameParameterCount;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -312,20 +305,10 @@ public class JetSourceNavigationHelper {
|
|||||||
final @NotNull MemberNavigationStrategy<Decl, Descr> navigationStrategy,
|
final @NotNull MemberNavigationStrategy<Decl, Descr> navigationStrategy,
|
||||||
@NotNull Collection<Decl> candidates
|
@NotNull Collection<Decl> candidates
|
||||||
) {
|
) {
|
||||||
final JetTypeReference decompiledReceiver = navigationStrategy.getReceiverType(decompiledDeclaration);
|
|
||||||
|
|
||||||
return ContainerUtil.filter(candidates, new Condition<Decl>() {
|
return ContainerUtil.filter(candidates, new Condition<Decl>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean value(Decl candidate) {
|
public boolean value(Decl candidate) {
|
||||||
if (decompiledReceiver != null) {
|
return receiverAndParametersShortTypesMatch(navigationStrategy, candidate, decompiledDeclaration);
|
||||||
JetTypeReference candidateReceiver = navigationStrategy.getReceiverType(candidate);
|
|
||||||
assert candidateReceiver != null;
|
|
||||||
if (!MemberMatching.typesHaveSameShortName(decompiledReceiver, candidateReceiver)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MemberMatching.parameterShortTypesMatch(navigationStrategy, candidate, decompiledDeclaration);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import com.google.common.collect.Sets;
|
|||||||
import com.intellij.util.Function;
|
import com.intellij.util.Function;
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
@@ -41,6 +40,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class MemberMatching {
|
public class MemberMatching {
|
||||||
|
/* DECLARATIONS ROUGH MATCHING */
|
||||||
private static String getTypeShortName(@NotNull JetTypeReference typeReference) {
|
private static String getTypeShortName(@NotNull JetTypeReference typeReference) {
|
||||||
JetTypeElement typeElement = typeReference.getTypeElement();
|
JetTypeElement typeElement = typeReference.getTypeElement();
|
||||||
assert typeElement != null;
|
assert typeElement != null;
|
||||||
@@ -77,19 +77,68 @@ public class MemberMatching {
|
|||||||
}, null);
|
}, 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));
|
return getTypeShortName(a).equals(getTypeShortName(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean receiversMatch(
|
static <Decl extends JetNamedDeclaration> boolean sameReceiverPresenceAndParametersCount(
|
||||||
@Nullable JetTypeReference receiverTypeRef,
|
@NotNull MemberNavigationStrategy<Decl, ?> navigationStrategy,
|
||||||
@Nullable ReceiverParameterDescriptor receiverParameter
|
@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 <Decl extends JetNamedDeclaration> boolean receiverAndParametersShortTypesMatch(
|
||||||
|
@NotNull MemberNavigationStrategy<Decl, ?> 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<JetParameter> aParameters = navigationStrategy.getValueParameters(a);
|
||||||
|
List<JetParameter> 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 <Decl extends JetNamedDeclaration> boolean receiversMatch(
|
||||||
|
@NotNull MemberNavigationStrategy<Decl, ?> navigationStrategy,
|
||||||
|
@NotNull Decl declaration,
|
||||||
|
@NotNull CallableDescriptor descriptor
|
||||||
|
) {
|
||||||
|
JetTypeReference declarationReceiver = navigationStrategy.getReceiverType(declaration);
|
||||||
|
ReceiverParameterDescriptor descriptorReceiver = descriptor.getReceiverParameter();
|
||||||
|
if (declarationReceiver == null && descriptorReceiver == null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (receiverTypeRef != null && receiverParameter != null) {
|
if (declarationReceiver != null && descriptorReceiver != null) {
|
||||||
return receiverTypeRef.getText().equals(DescriptorRenderer.TEXT.renderType(receiverParameter.getType()));
|
return declarationReceiver.getText().equals(DescriptorRenderer.TEXT.renderType(descriptorReceiver.getType()));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -130,30 +179,6 @@ public class MemberMatching {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static <Decl extends JetNamedDeclaration> boolean parameterShortTypesMatch(
|
|
||||||
@NotNull MemberNavigationStrategy<Decl, ?> navigationStrategy,
|
|
||||||
@NotNull Decl a,
|
|
||||||
@NotNull Decl b
|
|
||||||
) {
|
|
||||||
List<JetParameter> aParameters = navigationStrategy.getValueParameters(a);
|
|
||||||
List<JetParameter> 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(
|
static boolean typeParametersMatch(
|
||||||
@NotNull JetTypeParameterListOwner typeParameterListOwner,
|
@NotNull JetTypeParameterListOwner typeParameterListOwner,
|
||||||
@NotNull List<TypeParameterDescriptor> typeParameterDescriptors
|
@NotNull List<TypeParameterDescriptor> typeParameterDescriptors
|
||||||
|
|||||||
Reference in New Issue
Block a user