Skip to content

Commit db1dc00

Browse files
datho7561mickaelistria
authored andcommitted
Fix some bugs in completion type filtering
- Do prefix filtering first; string comparison should be fast compared to more involved operations - Fix bad implementation of `protected` member classes; `getParent()` wasn't the right method to get the parent class of a member class - Impossible classes filtering was wrong, it was checking methods instead Signed-off-by: David Thompson <[email protected]>
1 parent 5153833 commit db1dc00

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionEngine.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,8 @@ public void complete(org.eclipse.jdt.internal.compiler.env.ICompilationUnit sour
14561456
if (!this.requestor.isIgnored(CompletionProposal.TYPE_REF)) {
14571457
final Set<String> alreadySuggestedFqn = ConcurrentHashMap.newKeySet();
14581458
findTypes(completeAfter, typeMatchRule, null)
1459+
.filter(type -> this.pattern.matchesName(this.prefix.toCharArray(),
1460+
type.getElementName().toCharArray()))
14591461
.filter(type -> filterTypeBasedOnAccess(type, currentPackage, currentTypeBinding))
14601462
.filter(type -> {
14611463
for (var scrapedBinding : defaultCompletionBindings.all().toList()) {
@@ -1467,8 +1469,6 @@ public void complete(org.eclipse.jdt.internal.compiler.env.ICompilationUnit sour
14671469
}
14681470
return true;
14691471
})
1470-
.filter(type -> this.pattern.matchesName(this.prefix.toCharArray(),
1471-
type.getElementName().toCharArray()))
14721472
.filter(type -> {
14731473
return filterBasedOnExtendsOrImplementsInfo(type, extendsOrImplementsInfo);
14741474
})
@@ -1541,11 +1541,11 @@ private boolean filterTypeBasedOnAccess(IType type, String currentPackage, IType
15411541
return true;
15421542
}
15431543
if ((flags & Flags.AccProtected) != 0) {
1544-
// protected means `type` is an inner class
1545-
if (currentTypeBinding == null) {
1544+
// if `protected` is used correctly means `type` is an inner class
1545+
if (currentTypeBinding == null || type.getDeclaringType() == null) {
15461546
return false;
15471547
}
1548-
return findInSupers(currentTypeBinding, ((IType)type.getParent()).getKey());
1548+
return findInSupers(currentTypeBinding, type.getDeclaringType().getKey());
15491549
}
15501550
// private inner class
15511551
return false;
@@ -2311,7 +2311,7 @@ private void processMembers(ITypeBinding typeBinding, Bindings scope,
23112311
return false;
23122312
}
23132313
} else {
2314-
if (impossibleMethods.contains(binding.getName())) {
2314+
if (impossibleClasses.contains(binding.getName())) {
23152315
return false;
23162316
}
23172317
}

0 commit comments

Comments
 (0)