Skip to content

Commit a7d5cec

Browse files
Rob Strykerdatho7561
authored andcommitted
Fixes testStringNestedSingleArgument04
Signed-off-by: Rob Stryker <[email protected]>
1 parent 76e9b8c commit a7d5cec

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacBindingResolver.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.ArrayList;
1616
import java.util.Arrays;
1717
import java.util.Collection;
18+
import java.util.Collections;
1819
import java.util.HashMap;
1920
import java.util.HashSet;
2021
import java.util.Iterator;
@@ -548,6 +549,11 @@ public IBinding findUnresolvedBinding(String bindingKey) {
548549
return findBinding(bindingKey);
549550
}
550551

552+
final boolean bkExtends = bindingKey.startsWith("+");
553+
final boolean bkSuper = bindingKey.startsWith("-");
554+
555+
String withoutSuperExtends = bindingKey.startsWith("+") || bindingKey.startsWith("-") ? bindingKey.substring(1) : bindingKey;
556+
551557
HashSet<String> validNames = new HashSet<String>();
552558
validNames.add(bindingKey);
553559
compoundListWithAction(validNames, x -> x.replaceAll("\\.", "/"));
@@ -556,25 +562,41 @@ public IBinding findUnresolvedBinding(String bindingKey) {
556562
compoundListWithAction(validNames, x -> x.lastIndexOf(".", x.length() - 1) != -1 ? x.substring(x.lastIndexOf(".") + 1) : null);
557563
compoundListWithAction(validNames, x -> x.startsWith("Q") ? x.substring(1) : null);
558564
compoundListWithAction(validNames, x -> x.contains("<Q") ? x.replaceAll("<Q", "<") : null);
559-
String bindingKeySimpleName = Signature.getSignatureSimpleName(bindingKey);
565+
compoundListWithAction(validNames, x -> x.startsWith("+Q") ? x.replaceAll("\\+Q", "? extends ") : null);
566+
compoundListWithAction(validNames, x -> x.startsWith("-Q") ? x.replaceAll("-Q", "? super ") : null);
567+
String bindingKeySimpleName = Signature.getSignatureSimpleName(withoutSuperExtends);
560568
validNames.add(bindingKeySimpleName);
561569

562570
Collection<JavacTypeBinding> c = new ArrayList<>(this.bindings.typeBinding.values());
563-
List<JavacTypeBinding> strongMatch = new ArrayList<>();
571+
int matchesKey = 0x80;
572+
int matchesSimpleName = 0x40;
573+
int matchesSuperExtends = 0x10;
574+
record Pair(JavacTypeBinding binding, int weight) {};
575+
List<Pair> collector = new ArrayList<Pair>();
576+
564577
c.stream().forEach(x -> {
578+
int total = 0;
579+
String k = x.getKey();
580+
if( validNames.contains(k))
581+
total += matchesKey;
565582
String n = x.getName();
566583
if( validNames.contains(n)) {
567-
strongMatch.add(x);
568-
return;
569-
}
570-
String k = x.getKey();
571-
if( validNames.contains(k)) {
572-
strongMatch.add(x);
573-
return;
584+
total += matchesSimpleName;
585+
}
586+
if( bkExtends || bkSuper ) {
587+
if( x.isWildcardType() && x.getBound() != null ) {
588+
if( bkExtends && x.isUpperbound()) {
589+
total += matchesSuperExtends;
590+
} else if( bkSuper && !x.isUpperbound() ) {
591+
total += matchesSuperExtends;
592+
}
593+
}
574594
}
595+
collector.add(new Pair(x, total));
575596
});
576597

577-
return strongMatch.size() > 0 ? strongMatch.get(0) : null;
598+
Collections.sort(collector, (o1, o2) -> o2.weight - o1.weight);
599+
return collector.size() > 0 ? collector.get(0).binding : null;
578600
}
579601

580602
@Override

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMTypeReferenceLocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ private int validateTypeParameters(Type node) {
355355
boolean plusOrMinus = patternSig.startsWith("+") || patternSig.startsWith("-");
356356
String safePatternString = plusOrMinus ? patternSig.substring(1) : patternSig;
357357
if( safePatternString.startsWith("Q")) {
358-
patternBinding = JdtCoreDomPackagePrivateUtility.findUnresolvedBindingForType(node, safePatternString);
358+
patternBinding = JdtCoreDomPackagePrivateUtility.findUnresolvedBindingForType(node, patternSig);
359359
} else {
360360
patternBinding = JdtCoreDomPackagePrivateUtility.findBindingForType(node, safePatternString);
361361
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/TypeArgumentMatchingUtility.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static boolean validateSingleTypeArgMatches(boolean requiresExactMatch, S
5353
if( patternSig.equals("*") && isQuestionMark(domSig)) {
5454
return true;
5555
}
56-
if( patternSig.startsWith("Q")) {
56+
if( patternSig.startsWith("Q") || patternSig.startsWith("+Q") || patternSig.startsWith("-Q")) {
5757
String patternSimpleName = null;
5858
try {
5959
patternSimpleName = Signature.getSignatureSimpleName(patternSig);

0 commit comments

Comments
 (0)