Skip to content

Commit 5d49b80

Browse files
committed
Skeleton of new general override members implementation. #359
1 parent 8d8af15 commit 5d49b80

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

server/src/main/kotlin/org/javacs/kt/KotlinProtocolExtensionService.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import org.eclipse.lsp4j.*
44
import org.javacs.kt.util.AsyncExecutor
55
import org.javacs.kt.util.parseURI
66
import org.javacs.kt.resolve.resolveMain
7+
import org.javacs.kt.position.offset
8+
import org.javacs.kt.listOverridableMembers
79
import java.util.concurrent.CompletableFuture
810
import java.nio.file.Paths
911

@@ -39,4 +41,12 @@ class KotlinProtocolExtensionService(
3941
"projectRoot" to workspacePath
4042
)
4143
}
44+
45+
override fun overrideMember(position: TextDocumentPositionParams): CompletableFuture<List<CodeAction>> = async.compute {
46+
val fileUri = parseURI(position.textDocument.uri)
47+
val compiledFile = sp.currentVersion(fileUri)
48+
val cursorOffset = offset(compiledFile.content, position.position)
49+
50+
listOverridableMembers(compiledFile, cursorOffset)
51+
}
4252
}

server/src/main/kotlin/org/javacs/kt/KotlinProtocolExtensions.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,9 @@ interface KotlinProtocolExtensions {
1515

1616
@JsonRequest
1717
fun mainClass(textDocument: TextDocumentIdentifier): CompletableFuture<Map<String, Any?>>
18+
19+
// TODO: what is the best return value in this case? CodeAction?
20+
// TODO: should the naming be something like listOverrideableMembers? or something similar instead?
21+
@JsonRequest
22+
fun overrideMember(position: TextDocumentPositionParams): CompletableFuture<List<CodeAction>>
1823
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.javacs.kt
2+
3+
import org.eclipse.lsp4j.Range
4+
import org.eclipse.lsp4j.CodeAction
5+
6+
7+
fun listOverridableMembers(file: CompiledFile, cursor: Int): List<CodeAction> {
8+
// TODO: implement
9+
10+
return listOf()
11+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.javacs.kt
2+
3+
import com.google.gson.Gson
4+
import org.eclipse.lsp4j.ExecuteCommandParams
5+
import org.eclipse.lsp4j.Position
6+
import org.eclipse.lsp4j.Range
7+
import org.eclipse.lsp4j.TextDocumentIdentifier
8+
import org.eclipse.lsp4j.TextDocumentPositionParams
9+
import org.junit.Test
10+
import org.hamcrest.Matchers.equalTo
11+
import org.hamcrest.Matchers.hasSize
12+
import org.junit.Assert.assertThat
13+
14+
// TODO: what should the title be? just the signature? or the name of the member? should we separate between methods and variables?
15+
16+
class OverrideMemberTest : SingleFileTestFixture("overridemember", "OverrideMembers.kt") {
17+
18+
val root = testResourcesRoot().resolve(workspaceRoot)
19+
val fileUri = root.resolve(file).toUri().toString()
20+
21+
@Test
22+
fun `should show all overrides for class`() {
23+
val result = languageServer.getProtocolExtensionService().overrideMember(TextDocumentPositionParams(TextDocumentIdentifier(fileUri), position(9, 8))).get()
24+
25+
assertThat(result, hasSize(2))
26+
27+
val firstCodeAction = result[0]
28+
assertThat(firstCodeAction.title, equalTo("text"))
29+
30+
val firstTextEdit = firstCodeAction.edit.changes
31+
assertThat(firstTextEdit.containsKey(fileUri), equalTo(true))
32+
assertThat(firstTextEdit[fileUri], hasSize(1))
33+
34+
val memberToImplementEdit = firstTextEdit[fileUri]?.get(0)
35+
assertThat(memberToImplementEdit?.range, equalTo(range(9, 32, 9, 32)))
36+
assertThat(memberToImplementEdit?.newText, equalTo(System.lineSeparator() + System.lineSeparator() + " override val text: String = ???"))
37+
38+
39+
val secondCodeAction = result[1]
40+
assertThat(secondCodeAction.title, equalTo("print"))
41+
42+
val secondTextEdit = secondCodeAction.edit.changes
43+
assertThat(secondTextEdit.containsKey(fileUri), equalTo(true))
44+
assertThat(secondTextEdit[fileUri], hasSize(1))
45+
46+
val functionToImplementEdit = secondTextEdit[fileUri]?.get(0)
47+
assertThat(functionToImplementEdit?.range, equalTo(range(9, 32, 9, 32)))
48+
assertThat(functionToImplementEdit?.newText, equalTo(System.lineSeparator() + System.lineSeparator() + " override fun print() {}"))
49+
}
50+
51+
@Test
52+
fun `should show one override for class where other alternatives are already implemented`() {
53+
val result = languageServer.getProtocolExtensionService().overrideMember(TextDocumentPositionParams(TextDocumentIdentifier(fileUri), position(11, 8))).get()
54+
55+
assertThat(result, hasSize(1))
56+
57+
val codeAction = result[0]
58+
assertThat(codeAction.title, equalTo("print"))
59+
60+
val textEdit = codeAction.edit.changes
61+
assertThat(textEdit.containsKey(fileUri), equalTo(true))
62+
assertThat(textEdit[fileUri], hasSize(1))
63+
64+
val functionToImplementEdit = textEdit[fileUri]?.get(0)
65+
assertThat(functionToImplementEdit?.range, equalTo(range(12, 57, 12, 57)))
66+
assertThat(functionToImplementEdit?.newText, equalTo(System.lineSeparator() + System.lineSeparator() + " override fun print() {}"))
67+
}
68+
69+
@Test
70+
fun `should show NO overrides for class where all other alternatives are already implemented`() {
71+
val result = languageServer.getProtocolExtensionService().overrideMember(TextDocumentPositionParams(TextDocumentIdentifier(fileUri), position(15, 8))).get()
72+
73+
assertThat(result, hasSize(0))
74+
}
75+
76+
// TODO: test for kotlin sdk and jdk classes to verify that it works
77+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
interface Printable {
2+
val text: String
3+
4+
fun print() {
5+
println("not implemented yet yo")
6+
}
7+
}
8+
9+
class MyPrintable: Printable {}
10+
11+
class OtherPrintable: Printable {
12+
override val text: String = "you had me at lasagna"
13+
}
14+
15+
class CompletePrintable: Printable {
16+
override val text: String = "something something something darkside"
17+
18+
override fun print() {
19+
println("not implemented yet yo")
20+
}
21+
}

0 commit comments

Comments
 (0)