diff options
-rw-r--r-- | TODOS.md | 1 | ||||
-rw-r--r-- | src/main/java/org/javacs/Completion.java | 2 | ||||
-rw-r--r-- | src/main/java/org/javacs/JavaCompilerService.java | 24 | ||||
-rw-r--r-- | src/main/java/org/javacs/JavaTextDocumentService.java | 6 | ||||
-rw-r--r-- | src/test/java/org/javacs/CompletionsTest.java | 10 | ||||
-rw-r--r-- | src/test/test-project/workspace/src/org/javacs/example/AutocompleteClassName.java | 1 |
6 files changed, 36 insertions, 8 deletions
@@ -5,7 +5,6 @@ - Workspace root as source path crashes compiler ## Autocomplete -- public [class NameOfFile] - NameOfClass... default constructor initializing final fields - im[plements] - Annotation fields diff --git a/src/main/java/org/javacs/Completion.java b/src/main/java/org/javacs/Completion.java index bf30d17..48e57ee 100644 --- a/src/main/java/org/javacs/Completion.java +++ b/src/main/java/org/javacs/Completion.java @@ -11,7 +11,7 @@ public class Completion { public final PackagePart packagePart; public final String keyword; public final String notImportedClass; - public final String snippet; + public final String snippet; // TODO separate label and insertText private Completion( Element element, PackagePart packagePart, String keyword, String notImportedClass, String snippet) { diff --git a/src/main/java/org/javacs/JavaCompilerService.java b/src/main/java/org/javacs/JavaCompilerService.java index 376fbeb..f1587dc 100644 --- a/src/main/java/org/javacs/JavaCompilerService.java +++ b/src/main/java/org/javacs/JavaCompilerService.java @@ -538,6 +538,7 @@ public class JavaCompilerService { } private static String[] TOP_LEVEL_KEYWORDS = { + "package", "import", "public", "private", @@ -698,11 +699,6 @@ public class JavaCompilerService { var partialName = Objects.toString(node.getName(), ""); // Add keywords if (insideClass == 0) { - for (var k : TOP_LEVEL_KEYWORDS) { - if (k.startsWith(partialName)) { - result.add(Completion.ofKeyword(k)); - } - } // If no package declaration is present, suggest package [inferred name]; if (parse.getPackage() == null) { relativeToSourcePath(file).ifPresent(relative -> { @@ -710,6 +706,24 @@ public class JavaCompilerService { result.add(Completion.ofSnippet("package " + name + ";\n\n")); }); } + // If no class declaration is present, suggest class [file name] + var hasClassDeclaration = false; + for (var t : parse.getTypeDecls()) { + if (!(t instanceof ErroneousTree)) { + hasClassDeclaration = true; + } + } + if (!hasClassDeclaration) { + var name = Paths.get(file).getFileName().toString(); + name = name.substring(0, name.length() - ".java".length()); + result.add(Completion.ofSnippet("class " + name + " {\n $0\n}")); + } + // Add keywords + for (var k : TOP_LEVEL_KEYWORDS) { + if (k.startsWith(partialName)) { + result.add(Completion.ofKeyword(k)); + } + } } else if (insideMethod == 0) { for (var k : CLASS_BODY_KEYWORDS) { diff --git a/src/main/java/org/javacs/JavaTextDocumentService.java b/src/main/java/org/javacs/JavaTextDocumentService.java index 643e73d..7c93a85 100644 --- a/src/main/java/org/javacs/JavaTextDocumentService.java +++ b/src/main/java/org/javacs/JavaTextDocumentService.java @@ -92,22 +92,28 @@ class JavaTextDocumentService implements TextDocumentService { i.setKind(completionItemKind(c.element)); // Detailed name will be resolved later, using docs to fill in method names if (!(c.element instanceof ExecutableElement)) i.setDetail(c.element.toString()); + i.setSortText(1 + i.getLabel()); } else if (c.packagePart != null) { i.setLabel(c.packagePart.name); i.setKind(CompletionItemKind.Module); i.setDetail(c.packagePart.fullName); + i.setSortText(1 + i.getLabel()); } else if (c.keyword != null) { i.setLabel(c.keyword); i.setKind(CompletionItemKind.Keyword); i.setDetail("keyword"); + i.setSortText(1 + i.getLabel()); } else if (c.notImportedClass != null) { i.setLabel(Parser.lastName(c.notImportedClass)); i.setKind(CompletionItemKind.Class); i.setDetail(c.notImportedClass); + i.setSortText(1 + i.getLabel()); } else if (c.snippet != null) { i.setLabel(c.snippet); i.setKind(CompletionItemKind.Snippet); + i.setInsertText(c.snippet); i.setInsertTextFormat(InsertTextFormat.Snippet); + i.setSortText(0 + i.getLabel()); } else throw new RuntimeException(c + " is not valid"); result.add(i); diff --git a/src/test/java/org/javacs/CompletionsTest.java b/src/test/java/org/javacs/CompletionsTest.java index 3f70c0b..0d5757e 100644 --- a/src/test/java/org/javacs/CompletionsTest.java +++ b/src/test/java/org/javacs/CompletionsTest.java @@ -759,6 +759,14 @@ public class CompletionsTest extends CompletionsBase { var file = "/org/javacs/example/AutocompletePackageName.java"; var suggestions = insertText(file, 1, 5); - assertThat(suggestions, contains("package org.javacs.example;\n\n")); + assertThat(suggestions, hasItem(startsWith("package org.javacs.example;"))); + } + + @Test + public void className() throws IOException { + var file = "/org/javacs/example/AutocompleteClassName.java"; + var suggestions = insertText(file, 1, 2); + + assertThat(suggestions, hasItem(startsWith("class AutocompleteClassName"))); } } diff --git a/src/test/test-project/workspace/src/org/javacs/example/AutocompleteClassName.java b/src/test/test-project/workspace/src/org/javacs/example/AutocompleteClassName.java new file mode 100644 index 0000000..3410062 --- /dev/null +++ b/src/test/test-project/workspace/src/org/javacs/example/AutocompleteClassName.java @@ -0,0 +1 @@ +c
\ No newline at end of file |