summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODOS.md1
-rw-r--r--src/main/java/org/javacs/Completion.java2
-rw-r--r--src/main/java/org/javacs/JavaCompilerService.java24
-rw-r--r--src/main/java/org/javacs/JavaTextDocumentService.java6
-rw-r--r--src/test/java/org/javacs/CompletionsTest.java10
-rw-r--r--src/test/test-project/workspace/src/org/javacs/example/AutocompleteClassName.java1
6 files changed, 36 insertions, 8 deletions
diff --git a/TODOS.md b/TODOS.md
index 4db7a74..14114a5 100644
--- a/TODOS.md
+++ b/TODOS.md
@@ -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