Skip to content

Commit 2ec98a5

Browse files
committed
Everything except source-path constructors works
1 parent aedfb21 commit 2ec98a5

4 files changed

Lines changed: 57 additions & 12 deletions

File tree

‎src/main/java/org/javacs/Completions.java‎

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -337,11 +337,12 @@ private Stream<CompletionItem> notImportedConstructors(String partialIdentifier,
337337
* Suggest classes that haven't yet been imported, but are on the source or class path
338338
*/
339339
private Stream<CompletionItem> notImportedClasses(String partialIdentifier, Scope scope) {
340-
Stream<CompletionItem> fromClassPath = accessibleClassPathClasses(partialIdentifier, scope)
341-
.map(this::completeClassNameFromClassPath);
342-
// TODO sourcePath
340+
Stream<String> fromSourcePath = accessibleSourcePathClasses(partialIdentifier, scope);
341+
Stream<String> fromClassPath = accessibleClassPathClasses(partialIdentifier, scope)
342+
.map(c -> c.getName());
343343

344-
return fromClassPath;
344+
return Stream.concat(fromSourcePath, fromClassPath)
345+
.map(this::completeClassNameFromClassPath);
345346
}
346347

347348
private Stream<ClassPath.ClassInfo> accessibleClassPathClasses(String partialIdentifier, Scope scope) {
@@ -352,6 +353,13 @@ private Stream<ClassPath.ClassInfo> accessibleClassPathClasses(String partialIde
352353
.filter(c -> classPath.isAccessibleFromPackage(c, packageName));
353354
}
354355

356+
private Stream<String> accessibleSourcePathClasses(String partialIdentifier, Scope scope) {
357+
String packageName = packageName(scope);
358+
359+
return sourcePath.accessibleTopLevelClasses(packageName)
360+
.filter(c -> containsCharactersInOrder(lastId(c), partialIdentifier));
361+
}
362+
355363
private String packageName(Scope scope) {
356364
PackageElement packageEl = elements.getPackageOf(scope.getEnclosingClass());
357365

@@ -575,15 +583,16 @@ private CompletionItem completeConstructorFromClassPath(Constructor<?> c) {
575583
return item;
576584
}
577585

578-
private CompletionItem completeClassNameFromClassPath(ClassPath.ClassInfo info) {
586+
private CompletionItem completeClassNameFromClassPath(String qualifiedName) {
579587
CompletionItem item = new CompletionItem();
580-
581-
item.setLabel(info.getSimpleName());
582-
item.setDetail(info.getPackageName());
583-
item.setInsertText(info.getSimpleName());
584-
item.setAdditionalTextEdits(addImport(info.getName()));
585-
item.setSortText("2/" + info.getSimpleName());
586-
item.setData(info.getName());
588+
String packageName = mostIds(qualifiedName), simpleName = lastId(qualifiedName);
589+
590+
item.setLabel(simpleName);
591+
item.setDetail(packageName);
592+
item.setInsertText(simpleName);
593+
item.setAdditionalTextEdits(addImport(qualifiedName));
594+
item.setSortText("2/" + simpleName);
595+
item.setData(qualifiedName);
587596

588597
// TODO implement vscode resolve-completion-item
589598

‎src/main/java/org/javacs/SymbolIndex.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,18 @@ private void addDeclaration() {
179179
});
180180
}
181181

182+
public Stream<String> accessibleTopLevelClasses(String fromPackage) {
183+
finishedInitialIndex.join();
184+
185+
return sourcePathFiles.values().stream()
186+
.flatMap(index -> {
187+
return Stream.concat(
188+
index.publicTopLevelClasses.stream(),
189+
index.packagePrivateTopLevelClasses.stream().filter(name -> Completions.mostIds(name).equals(fromPackage))
190+
);
191+
});
192+
}
193+
182194
public Stream<String> allTopLevelClasses() {
183195
finishedInitialIndex.join();
184196

‎src/test/java/org/javacs/CompletionsTest.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,23 @@ public void importClass() throws IOException {
554554
}
555555
}
556556

557+
@Test
558+
public void otherPackageId() throws IOException {
559+
String file = "/org/javacs/example/AutocompleteOtherPackage.java";
560+
561+
// Static methods
562+
List<? extends CompletionItem> items = items(file, 5, 14);
563+
List<String> suggestions = Lists.transform(items, i -> i.getLabel());
564+
565+
assertThat(suggestions, hasItems("OtherPackagePublic"));
566+
assertThat(suggestions, not(hasItems("OtherPackagePrivate")));
567+
568+
for (CompletionItem item : items) {
569+
if (item.getLabel().equals("OtherPackagePublic"))
570+
assertThat("Auto-import OtherPackagePublic", item.getAdditionalTextEdits(), not(empty()));
571+
}
572+
}
573+
557574
@Test
558575
public void fieldFromStaticInner() throws IOException {
559576
String file = "/org/javacs/example/AutocompleteOuter.java";
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.javacs.example;
2+
3+
public class AutocompleteOtherPackage {
4+
public void test() {
5+
Other
6+
}
7+
}

0 commit comments

Comments
 (0)