From 15d0bf39d3eb96141655ae30b72d414878c7c2a5 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 31 Jan 2025 16:32:18 -0500 Subject: [PATCH] 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 --- .../jdt/internal/codeassist/DOMCompletionEngine.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionEngine.java b/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionEngine.java index 717f2ff7362..9f31a75cb66 100644 --- a/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionEngine.java +++ b/org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionEngine.java @@ -1456,6 +1456,8 @@ public void complete(org.eclipse.jdt.internal.compiler.env.ICompilationUnit sour if (!this.requestor.isIgnored(CompletionProposal.TYPE_REF)) { final Set alreadySuggestedFqn = ConcurrentHashMap.newKeySet(); findTypes(completeAfter, typeMatchRule, null) + .filter(type -> this.pattern.matchesName(this.prefix.toCharArray(), + type.getElementName().toCharArray())) .filter(type -> filterTypeBasedOnAccess(type, currentPackage, currentTypeBinding)) .filter(type -> { for (var scrapedBinding : defaultCompletionBindings.all().toList()) { @@ -1467,8 +1469,6 @@ public void complete(org.eclipse.jdt.internal.compiler.env.ICompilationUnit sour } return true; }) - .filter(type -> this.pattern.matchesName(this.prefix.toCharArray(), - type.getElementName().toCharArray())) .filter(type -> { return filterBasedOnExtendsOrImplementsInfo(type, extendsOrImplementsInfo); }) @@ -1541,11 +1541,11 @@ private boolean filterTypeBasedOnAccess(IType type, String currentPackage, IType return true; } if ((flags & Flags.AccProtected) != 0) { - // protected means `type` is an inner class - if (currentTypeBinding == null) { + // if `protected` is used correctly means `type` is an inner class + if (currentTypeBinding == null || type.getDeclaringType() == null) { return false; } - return findInSupers(currentTypeBinding, ((IType)type.getParent()).getKey()); + return findInSupers(currentTypeBinding, type.getDeclaringType().getKey()); } // private inner class return false; @@ -2311,7 +2311,7 @@ private void processMembers(ITypeBinding typeBinding, Bindings scope, return false; } } else { - if (impossibleMethods.contains(binding.getName())) { + if (impossibleClasses.contains(binding.getName())) { return false; } }