Skip to content

Commit f25458e

Browse files
committed
Remove access to CompletionEngine.completionToken
Signed-off-by: David Thompson <[email protected]>
1 parent e0066d6 commit f25458e

File tree

1 file changed

+68
-5
lines changed

1 file changed

+68
-5
lines changed

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

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.eclipse.jdt.core.search.TypeNameMatchRequestor;
3131
import org.eclipse.jdt.internal.codeassist.impl.AssistOptions;
3232
import org.eclipse.jdt.internal.codeassist.impl.Keywords;
33+
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
3334
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
3435
import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner;
3536
import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
@@ -40,6 +41,7 @@
4041
import org.eclipse.jdt.internal.core.SearchableEnvironment;
4142
import org.eclipse.jdt.internal.core.SourceType;
4243
import org.eclipse.jdt.internal.core.util.Messages;
44+
import org.eclipse.jdt.internal.core.util.Util;
4345

4446
/**
4547
* A completion engine using a DOM as input (as opposed to {@link CompletionEngine} which
@@ -210,7 +212,6 @@ public void run() {
210212
// var completionContext = new DOMCompletionContext(this.offset, completeAfter.toCharArray(),
211213
// computeEnclosingElement(), defaultCompletionBindings::stream, expectedTypes, this.toComplete);
212214
var completionContext = new DOMCompletionContext(this.unit, this.modelUnit, this.cuBuffer, this.offset, this.assistOptions, defaultCompletionBindings);
213-
this.nestedEngine.completionToken = completionContext.getToken();
214215
this.requestor.acceptContext(completionContext);
215216

216217
this.expectedTypes = completionContext.expectedTypes;
@@ -1078,9 +1079,6 @@ public void run() {
10781079
// currently, this is always run, even when not using the default completion,
10791080
// because method argument guessing uses it.
10801081
scrapeAccessibleBindings(defaultCompletionBindings);
1081-
if (shouldSuggestPackages(toComplete)) {
1082-
suggestPackages(toComplete);
1083-
}
10841082
if (context instanceof SimpleName simple && !(simple.getParent() instanceof Name)) {
10851083
for (ImportDeclaration importDecl : (List<ImportDeclaration>)this.unit.imports()) {
10861084
if (importDecl.isStatic()) {
@@ -1484,10 +1482,75 @@ private void suggestPackages(ASTNode context) {
14841482
}
14851483
String prefix = context instanceof Name name ? name.toString() : this.prefix;
14861484
if (prefix != null && !prefix.isBlank()) {
1487-
this.nameEnvironment.findPackages(prefix.toCharArray(), this.nestedEngine);
1485+
Set<String> packageNames = new HashSet<>();
1486+
this.nameEnvironment.findPackages(prefix.toCharArray(), new ISearchRequestor() {
1487+
1488+
@Override
1489+
public void acceptConstructor(int modifiers, char[] simpleTypeName, int parameterCount,
1490+
char[] signature, char[][] parameterTypes, char[][] parameterNames, int typeModifiers,
1491+
char[] packageName, int extraFlags, String path, AccessRestriction access) {
1492+
// do nothing
1493+
}
1494+
1495+
@Override
1496+
public void acceptType(char[] packageName, char[] typeName, char[][] enclosingTypeNames, int modifiers,
1497+
AccessRestriction accessRestriction) {
1498+
// do nothing
1499+
}
1500+
1501+
@Override
1502+
public void acceptPackage(char[] packageName) {
1503+
String packageNameString = new String(packageName);
1504+
// TODO: CompletionEngine has a caching mechanism for this
1505+
if (isValidPackageName(packageNameString)) {
1506+
packageNames.add(new String(packageName));
1507+
}
1508+
}
1509+
1510+
@Override
1511+
public void acceptModule(char[] moduleName) {
1512+
// do nothing
1513+
}
1514+
1515+
});
1516+
for (String packageName : packageNames) {
1517+
this.requestor.accept(toPackageProposal(packageName, context));
1518+
}
14881519
}
14891520
}
14901521

1522+
private boolean isValidPackageName(String packageName) {
1523+
String[] names = packageName.split("\\."); //$NON-NLS-1$
1524+
for (String name : names) {
1525+
if (!Util.isValidFolderNameForPackage(
1526+
name,
1527+
this.modelUnit.getJavaProject().getOption(JavaCore.COMPILER_SOURCE, true),
1528+
this.modelUnit.getJavaProject().getOption(JavaCore.COMPILER_COMPLIANCE, true))) {
1529+
return false;
1530+
}
1531+
}
1532+
return true;
1533+
}
1534+
1535+
private CompletionProposal toPackageProposal(String packageName, ASTNode completing) {
1536+
InternalCompletionProposal res = createProposal(CompletionProposal.PACKAGE_REF);
1537+
res.setCompletion(packageName.toCharArray());
1538+
res.setDeclarationSignature(packageName.toCharArray());
1539+
res.setPackageName(packageName.toCharArray());
1540+
QualifiedName qualifiedName = (QualifiedName)DOMCompletionUtil.findParent(completing, new int[] {ASTNode.QUALIFIED_NAME});
1541+
int relevance = RelevanceConstants.R_DEFAULT
1542+
+ RelevanceConstants.R_RESOLVED
1543+
+ RelevanceConstants.R_INTERESTING
1544+
+ computeRelevanceForCaseMatching(this.qualifiedPrefix.toCharArray(), packageName.toCharArray(), this.assistOptions)
1545+
+ computeRelevanceForQualification(true)
1546+
+ RelevanceConstants.R_NON_RESTRICTED;
1547+
res.setRelevance(relevance);
1548+
if (qualifiedName != null) {
1549+
res.setReplaceRange(qualifiedName.getStartPosition(), this.offset);
1550+
}
1551+
return res;
1552+
}
1553+
14911554
private void suggestTypesInPackage(String packageName) {
14921555
if (!this.requestor.isIgnored(CompletionProposal.TYPE_REF)) {
14931556
List<IType> foundTypes = findTypes(this.prefix, packageName).toList();

0 commit comments

Comments
 (0)